[英]How to get asynchronousy without new threads or async and await keywords but only Task
我想知道如何在不使用額外線程或await
和async
關鍵字但僅使用Task的情況下完成以下程序的相同操作。 一個示例代碼會很棒。 在我看來,我們需要使用IO綁定操作或任何長時間運行的操作的TaskCompletionSource
和Async
版本。
static void Main(string[] args)
{
Task t = Go();
Console.WriteLine("Hello World");
Task.Delay(1000).GetAwaiter().OnCompleted(() => { Console.WriteLine("Completed"); });
Console.ReadLine();
}
static async Task Go()
{
var task = PrintAnswerToLife();
await task;
Console.WriteLine("Done");
}
static async Task PrintAnswerToLife()
{
var task = GetAnswerToLife();
int answer = await task;
Console.WriteLine(answer);
}
static async Task<int> GetAnswerToLife()
{
var task = Task.Delay(2000);
await task;
int answer = 21 * 2;
return answer;
}
您可以使用ContinueWith
將async
/ await
轉換為Task
,非常簡單。 其他翻譯也是可能的,例如Task.Delay
變為System.Threading.Timer
。
基本模式是,對於執行await
任何async
方法:
static async Task Go()
{
var task = PrintAnswerToLife();
await task;
Console.WriteLine("Done");
}
變為:
static Task Go()
{
var tcs = new TaskCompletionSource<object>();
var task = PrintAnswerToLife();
task.ContinueWith(_ =>
{
Console.WriteLine("Done");
tcs.SetResult(null);
});
return tcs.Task;
}
正確的錯誤處理還有很多工作要做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.