亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將元組轉換為異步任務

如何將元組轉換為異步任務

C#
阿晨1998 2022-11-13 15:49:15
我正在做一個小應用程序,我需要幫助,因為我不知道問題出在哪里。好久沒接觸C#了,在一點一點的學習,因為這一切都是我的閑暇,不再。我有以下工作正常的元組:private Tuple<int, int, int, int> CheckStatus()        {            int out = 0;            int stage = 0;            int retired = 0;            int stop = 0;            for (int i = 0; i < Dgv.Rows.Count; i++)            {                if (Dgv.Rows[i].Cells["Start"].Value != null)                {                    out = out + 1;                }                if (Dgv.Rows[i].Cells["Start"].Value != null && Dgv.Rows[i].Cells["Finnish"].Value == null)                {                    stage = stage + 1;                }                if (Dgv.Rows[i].Cells["Start"].Value != null && Dgv.Rows[i].Cells["Finnish"].Value != null)                {                    stop = stop + 1;                }            }            retired = GetRetirements();            stage = stage - retired;            return new Tuple<int, int, int,int>(out, stage, retired, stop);        }我想將它傳遞給異步執行 await 方法,因為現在 GetRetirements 方法是異步任務,并將代碼更改為此,但我遇到了問題:private async Task<Tuple<int, int, int, int>> CheckStatus()        {            int out = 0;            int stage = 0;            int retired = 0;            int stop = 0;            for (int i = 0; i < Dgv.Rows.Count; i++)            {                if (Dgv.Rows[i].Cells["Start"].Value != null)                {                    out = out + 1;                }                if (Dgv.Rows[i].Cells["Start"].Value != null && Dgv.Rows[i].Cells["Finnish"].Value == null)                {                    stage = stage + 1;                }                if (Dgv.Rows[i].Cells["Start"].Value != null && Dgv.Rows[i].Cells["Finnish"].Value != null)                {                    stop = stop + 1;                }            }            retired = await GetRetirements();            stage = stage - retired;            return new Tuple<int, int, int,int>(out, stage, retired, stop);        }我做錯了什么?這是我第一次使用 Tuple,我不知道它可能是錯誤的。非常感謝你。
查看完整描述

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();

}


查看完整回答
反對 回復 2022-11-13
?
Helenr

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();

}


查看完整回答
反對 回復 2022-11-13
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

您更改CheckStatus()為返回 a Task<>。您可能應該await這樣做并像以前一樣使用結果。

您還可以根據您的 UI 框架以不同的方式處理它。但歸結為“這種方法現在是aysnc,就這樣處理吧?!?/p>


查看完整回答
反對 回復 2022-11-13
?
莫回無

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);

}


查看完整回答
反對 回復 2022-11-13
  • 4 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號