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