如果它是可以在後臺運行,並沒有強制同步的東西,嘗試在Task.Run包裝的代碼(即調用異步方法)( )。我不確定這會解決「死鎖」問題(如果它不同步,那是另一個問題),但是如果您想從異步/等待中受益,如果您一直沒有異步,除非您在後臺線程中運行,否則我不確定是否有好處。我有一個例子,在幾個地方添加Task.Run()(在我的情況下,從我更改爲異步的MVC控制器)並調用異步方法不僅提高了性能,而且提高了可靠性(不確定它是一個「僵局」,但似乎是類似的東西)在較重的負載下。
你會發現使用Task.Run()被一些人認爲是一種不好的方式來做到這一點,但我真的不能在我的情況下看到更好的方式來做到這一點,它確實似乎是一種提升。也許這是其中一種理想的方式來做它,而不是讓它在你所處的不完美的情況下工作的方式之一。:-)
[由於請求代碼更新]
因此,正如其他人發佈的那樣,您應該「完全異步」。就我而言,我的數據不是異步的,但我的用戶界面是。所以,我儘可能地減少了異步,然後用Task.Run包裝我的數據調用,這樣纔有意義。我認爲,這是一個竅門,要弄清楚事情是否可以並行運行,否則,你只是同步的(如果你使用異步並立即解決它,迫使它等待答案)。我有一些可以並行執行的讀取操作。
在上面的示例中,我認爲只要有意義,就必須先進行異步處理,然後在某個時刻確定可以分離出哪些地方並獨立於其他代碼執行操作。假設您有一個可以保存數據的操作,但您並不需要等待響應 - 您可以保存並完成操作。唯一需要注意的是不要等待該線程/任務完成才能關閉程序。代碼的意義在哪裏取決於您。
語法很簡單。我使用了現有的代碼,將控制器更改爲異步,返回之前返回的我的類的任務。
var myTask = Task.Run(() =>
{
//...some code that can run independently.... In my case, loading data
});
// ...other code that can run at the same time as the above....
await Task.WhenAll(myTask, otherTask);
//..or...
await myTask;
//At this point, the result is available from the task
myDataValue = myTask.Result;
查看MSDN瞭解可能是更好的例子: https://msdn.microsoft.com/en-us/library/hh195051(v=vs.110).aspx
[更新2,更相關的原題]
比方說,你的數據讀取是異步方法。
private async Task<MyClass> Read()
你可以調用它,保存任務,並等待它時準備:
var runTask = Read();
//... do other code that can run in parallel
await runTask;
所以,爲了這個目的,調用異步代碼,這是原來的海報正在請求,我不要以爲你需要Task.Run(),儘管我不認爲你可以使用「await」,除非你是一個異步方法 - 你需要一個替代的Wait語法。
訣竅是,如果沒有一些代碼可以並行運行,就沒什麼意義了,所以考慮多線程仍然是關鍵。
它看起來像這可能是阻止 - >列表= GetDataAsync()。結果() –
客戶端或服務器上的死鎖? –
嘗試返回結果而不是等待。 'await'並返回 –