昨天我問了一個question,答案很好。但是現在我想了解await
的作用以及任務執行的工作方式。有和沒有等待操作員的任務執行
我讀過關於await
:await運算符應用於異步方法中的任務,以掛起方法的執行,直到等待完成的任務完成。該任務代表正在進行的工作(來自msdn網站)。
Task.run
:Run方法允許您在單個方法調用中創建和執行任務,並且是對StartNew方法(來自msdn站點)的簡單替代方案。
現在,隨着代碼:
public async Task YourFunc()
{
Exception error = null;
try
{
var task = Task.Run(() =>
{
Thread.Sleep(3000);
throw new ArgumentException("test argument exception");
});
var completed = task.IsCompleted;
var faulted = task.IsFaulted;
Console.WriteLine(completed);
Console.WriteLine(faulted);
}
catch (Exception ex)
{
error = ex;
}
this.MigrationProcessCompleted(error);
}
我已經刪除了的await操作,我已經設置斷點上線Console.WriteLine(completed);
。爲什麼即使在這個斷點等待2-3分鐘後,任務也沒有完成,沒有出錯?我給自己定任務的代碼和內部斷點例外是trown,所以任務必須被標記爲故障或至少完成...
你在2-3分鐘後檢查什麼?'task.IsFaulted'或簡單的'faulted'變量在3分鐘前對這個值進行採樣? –
task.IsFaulted –
沒有等待,Task完成比YourFunc退出的時間晚了很多,所以嘗試抓取並且實際上整個方法完全沒用。完成和錯誤都是錯誤的,因爲在你點擊它們的那一刻,任務還沒有完成或者出錯。至於斷點 - 所有線程在斷點處暫停,所以無論等待多長時間 - 任務仍在進行中。 – Evk