[英]How to get exactly result from async methods via await without Task.Result?
我想嘗試異步和等待,但我有一個慘敗。 我有方法需要異步運行兩個方法(它部分工作)
public void Run()
{
Task[] tasks = new Task[2];
tasks[0] = Task.Factory.StartNew(DisplayInt);
tasks[1] = Task.Factory.StartNew(DisplayString);
//block thread until tasks end
Task.WaitAll(tasks);
}
並使用了兩種方法
public async void DisplayInt()
{
Task<int> task = new Task<int>(
() => 10);
task.Start();
Console.WriteLine(await task);
}
public async void DisplayString()
{
Task<string> task = new Task<string>(
() => "ok" );
task.Start();
Console.WriteLine(await task);
}
通常我得到下一個結果:1)10 ok
或2)確定10
但有時我什么都沒有
如何在不使用task.Result的情況下通過等待獲得異步方法的確切結果,或者它不會發生?
我建議您閱讀一些介紹性文章,例如我自己的async
介紹 ,並在我的MSDN文章中了解異步最佳實踐 。 如果你只是敲打代碼,你最終會遇到很多痛苦。
特別是,您不應該使用Task.Factory.StartNew
, Task
構造函數 , 也不 應該使用 Task.Start
; 並且你應該避免async void
(所有鏈接都是我的博客,我詳細解釋了為什么 )。
要回答您的實際問題:
如何在不使用task.Result的情況下通過等待獲得異步方法的確切結果,或者它不會發生?
要從任務中獲取結果,您可以異步等待任務完成(通過await
),也可以同步(阻塞)等待任務完成(通過Result
)。 沒有“其他方式”,如果這就是你所要求的。
歡迎來到SO ......
好吧,在你的情況下,兩個任務都需要更多的時間來初始化它們,然后在里面運行方法。 這就是為什么有時第二個任務在第一個任務完成之前完成(如果它在較短的時間內初始化)。 如果您將DisplayString
方法更改為:
public static async void DisplayString()
{
Task<string> task = new Task<string>(
() => { Thread.Sleep(10); return "ok"; });
task.Start();
Console.WriteLine(await task);
}
因為現在DisplayString
方法現在需要大約10毫秒來執行它將始終導致:
10
ok
PS正如Stephen Cleary所指出的,您可以閱讀一些關於async / await
基本文章。 我還建議在WinForms
項目上測試它,而不是使用Console
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.