有很多问题询问是否要混合异步和同步代码。
大多数答案都说,暴露同步包装器用于异步方法是一个坏主意,而暴露异步包装器用于同步方法也是如此。
然而,没有一个答案涉及到您必须混合异步和同步代码的具体情况,以及如何避免由此引起的常见陷阱。
请参考以下示例:
class Program
{
static void Main(string[] args)
{
IContract signatory = new SyncSignatory();
signatory.FullfillContractAsync().Wait();
signatory = new AsyncSignatory();
signatory.FullfillContractAsync().Wait();
}
}
using System.Threading.Tasks;
interface IContract
{
Task FullfillContractAsync();
}
using System.Threading.Tasks;
class AsyncSignatory : IContract
{
public async Task FullfillContractAsync()
{
await Task.Delay(5000);
}
}
using System.Threading;
using System.Threading.Tasks;
class SyncSignatory : IContract
{
public Task FullfillContractAsync()
{
Thread.Sleep(5000);
return Task.FromResult<object>(null);
}
}
或者:
using System.Threading;
using System.Threading.Tasks;
class SyncSignatory : IContract
{
public Task FullfillContractAsync()
{
return Task.Run(() => Thread.Sleep(5000));
}
}
在这个例子中,SyncSignatory和AsyncSignatory代表两个可以互换的类,因为它们执行相似的功能,但是以不同的方式执行这些功能-同步和异步。
在避免常见问题场景的情况下,如何混合合同同步和异步代码?
如果一个用户期望syncSig异步运行,但实际上它是同步的,那怎么办?
如果一个用户原本可以通过异步运行来优化syncSig,但是现在不再这样做,因为他们认为它已经异步运行了,那该怎么办?