2017-02-16 28 views
-2

考慮Load事件,這部分的主要形式有:await任務裏面等待的任務 - 其他代碼何時執行?

private async void MainForm_Load(object sender, EventArgs e) 
{ 
     var ServerConfigFile = new ClientConfigFile(Environment.CurrentDirectory); 
     ServerConfigFile.GenerateConfigFile(); 
     var taskCheck = Task.Run(() => CheckUpdate()); 
     await taskCheck; 
     lblUpdateMessage.Text = "Finished..."; 
     //more code here 
} 

而且CheckUpdate函數本身:

private async void CheckUpdate() 
{ 
     var connection = new ServerConnection(this); 

     Helper.CrossThreadInvoke(lblFileDownload,() => lblFileDownload.Text = "Downloading"); 

     Helper.CrossThreadInvoke(lblFileDownload,() => lblFileDownload.Text = "Done"); 
     var taskConfig = Task.Run(() => connection.GetServerConfig()); 
     await taskConfig; 
     ///some unrelated control changes here 
} 

此代碼是否正確地等待CheckUpdate運行完畢,所有的代碼(包括評論控制最後的變化)?我的推理是它開始TaskCheckUpdate它和awaits,返回控制MainFormCheckUpdate運行一個TaskGetServerConfig函數在它,awaits,傳遞控制回到MainForm_Load,但由於它仍然等待CheckUpdate完成,它不會繼續到lblUpdateMessage.Text = "Finished...";行。或者我錯了?

文藝青年最愛的此代碼是否actaully等待所有的CheckUpdate以顯示Finished前完成?

+1

是否有一個原因,你不能只是嘗試一下,看看? –

+0

我試圖和它失敗 - 試圖瞭解爲什麼它不工作。您是否有理由在沒有任何實際建議的情況下評論如何處理它或如何改進帖子? – Janushoff

+2

爲什麼在後臺線程中只運行一個方法讓它安排工作在UI線程或其他後臺線程中運行?只需在UI線程上運行它。 – Servy

回答

1

此代碼在顯示Finished之前是否等待所有CheckUpdate完成?

不,因爲CheckUpdateasync void方法。

你可以把它async Task,這將適當地等待CheckUpdate完成:

private async Task CheckUpdate() 

然而,看着你CheckUpdate功能,它似乎並不需要在後臺線程上運行。它更新UI控件,在後臺線程上運行某些內容,然後更新UI控件。它顯然是UI層的一部分,正如Servy指出的那樣 - 跳轉到後臺線程(Task.RunMainForm_Load)只是爲了跳回UI線程(Helper.CrossThreadInvoke)沒有意義。

因此,消除這些不必要的線程跳轉:

private async void MainForm_Load(object sender, EventArgs e) 
{ 
    var ServerConfigFile = new ClientConfigFile(Environment.CurrentDirectory); 
    ServerConfigFile.GenerateConfigFile(); 
    await CheckUpdateAsync(); 
    lblUpdateMessage.Text = "Finished..."; 
} 

private async Task CheckUpdateAsync() 
{ 
    var connection = new ServerConnection(this); 
    lblFileDownload.Text = "Downloading"; 
    lblFileDownload.Text = "Done"; 
    await Task.Run(() => connection.GetServerConfig()); 
    // some unrelated control changes here 
} 

最後,EJoshuaS指出,ServerConnection.GetServerConfig肯定聽起來像一個I/O的操作。你可以把這些電話自然異步(例如,使用HttpClient),爲Task.Run去除任何需要在所有:

private async Task CheckUpdateAsync() 
{ 
    var connection = new ServerConnection(this); 
    lblFileDownload.Text = "Downloading"; 
    lblFileDownload.Text = "Done"; 
    await connection.GetServerConfigAsync(); 
    // some unrelated control changes here 
}