4 回答

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
CheckStatus現(xiàn)在是一個(gè)異步函數(shù)。要獲得您需要的結(jié)果await,您可能只想調(diào)用該函數(shù)一次。請(qǐng)注意如何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貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
您已將內(nèi)部調(diào)用設(shè)為異步,但外部調(diào)用并未等待它。嘗試類似的東西:
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貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
您更改CheckStatus()
為返回 a Task<>
。您可能應(yīng)該await
這樣做并像以前一樣使用結(jié)果。
您還可以根據(jù)您的 UI 框架以不同的方式處理它。但歸結(jié)為“這種方法現(xiàn)在是aysnc,就這樣處理吧?!?/p>

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
原因是,您忘記在訪問結(jié)果之前等待CheckStatus()結(jié)果。
以 async 結(jié)尾的異步函數(shù)名稱是非常傳統(tǒng)的。這是為了警告用戶不要忘記他們正在使用 async-await,并且他們應(yīng)該在訪問結(jié)果之前等待返回值。
這還有一個(gè)好處是您可以同時(shí)提供普通版本和異步版本
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();
}
可能的性能改進(jìn)
您想要使用 GetRetirementsAsync 而不是非異步 GetRetirements 的原因是因?yàn)槟MM(jìn)程內(nèi)部的某處必須空閑地等待來自另一個(gè)進(jìn)程的結(jié)果,例如查詢數(shù)據(jù)庫、讀取文件或獲取數(shù)據(jù)來自網(wǎng)絡(luò)。
您可以使用 async await 來做其他事情,而不是無所事事地等待,直到您真正需要數(shù)據(jù)庫中的結(jié)果為止。
您可以通過啟動(dòng)任務(wù)來執(zhí)行此操作,而無需等待。該線程不會(huì)空閑地等待數(shù)據(jù)庫,而是繼續(xù)處理您的語句,直到您需要結(jié)果并等待任務(wù)。
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 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)