我覺得我已經閱讀了數以千計的 SO 問題和博客文章以及關于這些東西的 MSDN 文章,但我仍然沒有完全“理解”它。所以請幫幫我。在我的工作中,我們有一個 ASP.NET 應用程序,它必須從同步方法中獲取數據。我無法控制這種方法,也不知道它是如何實現的。我有一個異步控制器方法,它正在調用 3 個其他異步服務,我可以“一路向下”使用異步(是的!)。但最后一個不是異步的,而且可能永遠不會。更糟糕的是,它需要最長的時間。我希望能夠為所有服務啟動任務,并等待它們。從我能夠拼湊起來的情況來看,我有以下選項可供我使用,我想我了解大部分后果,但在必要時希望得到確認和澄清。所以,給定方法:public async Task<Thing> GetThing(){ var task1 = GetProp1Async(); // etc. var syncResult = ...... myThing.Prop1 = await task1; myThing.SyncProp = ....... return myThing;}我填寫這些點的選項可能是:選項1:只需同步調用該方法。這將阻塞我當前的線程。我的其他任務都可以運行,我可以稍后等待它們,但我將在這里阻塞,在我的異步方法中。var syncResult = GetSyncResult();選項 2:使用 Task.Run().Result。我知道這根本不理想,因為我會生成一個新線程,同時也會阻塞我的原始線程,我認為這是最糟糕的情況,對吧?但是,我不會遇到死鎖問題,因為我正在強制創建一個新線程,對嗎?var syncResult = Task.Run(() => GetSyncResult()).Result;選項 3:我認為這是最好的選擇?我的異步代碼不會阻塞線程,但我仍在生成一個新線程來執行同步工作。所以,這感覺就像是凈零增益。我仍然有 1 個線程在做事情,可能還在等待,但這仍然可能是我最好的選擇?var syncResult = await Task.Run(() => GetSyncResult());選項 4:我仍然不明白 ConfigureAwait(false),但我可以嘗試一下。這對我有什么好處?似乎有些帖子說“在所有地方都這樣做!” 有人說“不要這樣做以避免死鎖”。其他人說,如果你這樣做,就“一路向下”。好吧,我不知道 GetSyncResult() 做了什么,所以我不知道它是否在幕后調用了任何異步內容(我的意思是,它可能沒有,但我不確定)。那么它會回來咬我嗎?var syncResult = await Task.Run(() => GetSyncResult()).ConfigureAwait(false);那么我最好的選擇是什么?我錯過了任何選擇嗎?更糟糕的是,我錯過了最佳選擇嗎?我知道這些問題已經被問到并得到了死亡的回答,但是,我只是沒有把我的點聯系起來,我肯定需要一些幫助。
- 1 回答
- 0 關注
- 202 瀏覽
添加回答
舉報
0/150
提交
取消