有很多问题询问是否混合使用异步代码和同步代码。合同异步和同步代码
大多数答案认为为异步方法公开同步包装并为同步方法公开异步包装是一个坏主意。
但是,没有一个答案能够解决您需要混合异步代码和同步代码的特定情况,以及如何避免因此而出现的常见缺陷。
请看下面的例子:
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,但不再更长,这是因为他们认为它已经运行了异步?
@DanWilson修订。 –
我真的不知道这个问题。消费者需要了解的唯一方法是其参数,名称和返回类型。这种方法在内部对内部调用者应该没有什么影响 – Jonesopolis
我认为如果没有特定的用例,您的示例中目前太泛化了,我不认为您能够得到答案。谁会调用这些方法?你认为这是你的代码的热门路线吗? –