4 回答

TA貢獻2041條經驗 獲得超4個贊
CheckStatus現在是一個異步函數。要獲得您需要的結果await,您可能只想調用該函數一次。請注意如何async添加到事件處理程序GetCheckStatus并將一直流向async void事件處理程序,例如單擊按鈕。
private async Task GetCheckStatus()
{
var status = await CheckStatus()
LblOut.Text = status.Item1.ToString();
LblStage.Text = status.Item2.ToString();
LblRetired.Text = status.Item3.ToString();
LblStop.Text = status.Item4.ToString();
}

TA貢獻1780條經驗 獲得超4個贊
您已將內部調用設為異步,但外部調用并未等待它。嘗試類似的東西:
private async Task GetCheckStatus()
{
var result = await CheckStatus();
LblOut.Text = result .Item1.ToString();
LblStage.Text = result .Item2.ToString();
LblRetired.Text = result .Item3.ToString();
LblStop.Text = result .Item4.ToString();
}

TA貢獻1946條經驗 獲得超4個贊
您更改CheckStatus()
為返回 a Task<>
。您可能應該await
這樣做并像以前一樣使用結果。
您還可以根據您的 UI 框架以不同的方式處理它。但歸結為“這種方法現在是aysnc,就這樣處理吧?!?/p>

TA貢獻1865條經驗 獲得超7個贊
原因是,您忘記在訪問結果之前等待CheckStatus()結果。
以 async 結尾的異步函數名稱是非常傳統的。這是為了警告用戶不要忘記他們正在使用 async-await,并且他們應該在訪問結果之前等待返回值。
這還有一個好處是您可以同時提供普通版本和異步版本
async Task<int> GetRetirementsAsync(){...}
async Task<Tuple<int, int, int, int>> CheckStatusAsync()
{
...
int retired = await GetRetirementsAsync();
return new Tuple...
}
async Task GetCheckStatusAsync()
{
var tuple = await CheckStatusAsync();
// process output:
LblOut.Text = tuple.Item1.ToString();
LblStage.Text = tuple.Item2.ToString();
LblRetired.Text = tuple.Item3.ToString();
LblStop.Text = tuple.Item4.ToString();
}
可能的性能改進
您想要使用 GetRetirementsAsync 而不是非異步 GetRetirements 的原因是因為您希望進程內部的某處必須空閑地等待來自另一個進程的結果,例如查詢數據庫、讀取文件或獲取數據來自網絡。
您可以使用 async await 來做其他事情,而不是無所事事地等待,直到您真正需要數據庫中的結果為止。
您可以通過啟動任務來執行此操作,而無需等待。該線程不會空閑地等待數據庫,而是繼續處理您的語句,直到您需要結果并等待任務。
private async Task<Tuple<int, int, int, int>> CheckStatus()
{
// Get the retirements, do not await yet.
Task<int> taskGetRetirements = GetRetirementsAsync();
// instead of waiting idly, your thread is free to do the following:
int out = 0;
int stage = 0;
int retired = 0;
int stop = 0;
for (int i = 0; i < Dgv.Rows.Count; i++)
{
...
}
// now you need the retirements; await for the task to finish
int retired = await taskGetRetirements;
stage = stage - retired;
return new Tuple<int, int, int,int>(out, stage, retired, stop);
}
- 4 回答
- 0 關注
- 133 瀏覽
添加回答
舉報