有很多問題詢問是否混合使用異步代碼和同步代碼。合同異步和同步代碼
大多數答案認爲爲異步方法公開同步包裝併爲同步方法公開異步包裝是一個壞主意。
但是,沒有一個答案能夠解決您需要混合異步代碼和同步代碼的特定情況,以及如何避免因此而出現的常見缺陷。
請看下面的例子:
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
我認爲如果沒有特定的用例,您的示例中目前太泛化了,我不認爲您能夠得到答案。誰會調用這些方法?你認爲這是你的代碼的熱門路線嗎? –