有很多问题询问是否混合异步和同步代码。
大多数答案都表示,为异步方法公开同步包装器以及为同步方法公开异步包装器都是一个坏主意。
然而,没有一个答案解决了必须混合异步和同步代码的特定场景,以及如何避免因此而出现的常见陷阱。
请参见以下示例:
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);
}
}
Or:
using System.Threading;
using System.Threading.Tasks;
class SyncSignatory : IContract
{
public Task FullfillContractAsync()
{
return Task.Run(() => Thread.Sleep(5000));
}
}
在此示例中,SyncSignatory 和 AsyncSignatory 表示两个可互换的类,因为它们执行类似的功能,但它们以不同的方式(同步和异步)执行这些功能。
如何混合契约同步和异步代码,同时避免常见的陷阱场景?
如果用户希望syncSig 运行异步,但实际上却运行同步,该怎么办?
如果用户可以通过异步运行来优化syncSig,但由于他们假设它已经异步运行而不再这样做,那又怎么样?