簡體   English   中英

如何在沒有新線程或異步和等待關鍵字但僅任務的情況下獲得異步

[英]How to get asynchronousy without new threads or async and await keywords but only Task

我想知道如何在不使用額外線程或awaitasync關鍵字但僅使用Task的情況下完成以下程序的相同操作。 一個示例代碼會很棒。 在我看來,我們需要使用IO綁定操作或任何長時間運行的操作的TaskCompletionSourceAsync版本。

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;
}

您可以使用ContinueWithasync / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM