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

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

如何在執行異步操作時控制進度條

如何在執行異步操作時控制進度條

C#
繁星coding 2023-06-25 13:52:48
在為我的項目實現導出 util 的過程中,我遇到了上傳文件期間阻止 UI 的問題?;旧蠁栴}是在異步任務期間我無法更新進度欄。我已經嘗試了幾種解決方案。一般來說,當我調用exportPopUp.ShowDialog()時,它會阻止copyAttachment()的執行,并且整個邏輯在關閉表單后完成。我決定使用 Show() 但當我這樣做時,表單不存在(全灰色)這是我的背景邏輯:   private void exportButton_Click(object sender, EventArgs e)    {        // get files        int row = reportsDataGrid.CurrentCell.RowIndex;        if (row >= 0)        {            string problemId = reportsDataGrid.Rows[row].Cells[0].Value.ToString();            AC.Trace.I("Problem Id", problemId);            FolderBrowserDialog dlgFolderBrowser = new FolderBrowserDialog();            dlgFolderBrowser.Description = "Select folder to save Report files!";            DialogResult result = dlgFolderBrowser.ShowDialog();            if (result == DialogResult.OK)            {                string folderName = dlgFolderBrowser.SelectedPath;                AC.Trace.I("Destination folder name", folderName);                CIS.PRS.Data.Attachments attachments = jampPrsService.ReportFiles(problemId);                processAttachments(attachments, folderName, problemId);            }        }    }    private async void processAttachments(Attachments attachments, string folderName, string problemId)    {        this.exportPath = folderName + "\\" + problemId;        cts = new CancellationTokenSource();        this.exportPopUp = new exportPopUp(attachments.Size(), cts);        this.exportPopUp.ExportFinished += ExportPopUp_ExportFinished;        exportPopUp.setExportLabelText("Exporting problem report " + problemId);        exportPopUp.ShowDialog();        await copyAttachments(attachments, folderName, problemId);    }一般來說,整個邏輯按我的預期工作,但我無法同時復制任務和更新進度欄。提前致謝
查看完整描述

1 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

問題在于從異步處理切換到同步處理。您甚至可以在代碼中執行兩次。


如果您從 async wait 開始,則需要在整個調用層次結構中繪制它。


1) 從點擊處理程序開始。async void這應該是層次結構中的唯一方法。在這里等下一篇


private async void exportButton_Click(object sender, EventArgs e)

{

    await processAttachments(attachments, folderName, problemId);

}

2)使下一個調用的方法返回一個任務并使用,Show以便copyAttachments隨后執行并可以等待


          return Task here

                |

                v

private async Task processAttachments(Attachments attachments, string folderName, string problemId)

{

    this.exportPath = folderName + "\\" + problemId;

    cts = new CancellationTokenSource();

    this.exportPopUp = new exportPopUp(attachments.Size(), cts);

    this.exportPopUp.ExportFinished += ExportPopUp_ExportFinished;

    exportPopUp.setExportLabelText("Exporting problem report " + problemId);

    exportPopUp.Show();  // <= !

    await copyAttachments(attachments, folderName, problemId);

}

3) 使用返回的任務fs.WriteAsync并等待它。讓該copy方法再次返回一個 Task 以將其向上傳播:


private void copy(Attachment attachment, string folderName, string problemId)

{

    ...

    try

    {

        using (fs = new FileStream(Path.Combine(exportPath, attachment.Name), FileMode.Create))

        {

            awaitfs.WriteAsync(attachment.Data, 0, attachment.Data.Length, this.cts.Token);

            fs.Flush();

            fs.Close();

            this.exportPopUp.performProgressBarStep();

        }           

    }

    ...

4)等待復制方法(如果你想逐個復制附件):


private async Task copyAttachments(Attachments attachments, string folderName, string problemId)

{

    foreach (Attachment attachment in attachments.attachments)

    {            

        await copy(attachment, folderName, problemId));

    }

}

這應該會產生一個可行的解決方案,其中兩個表單都將保持響應,并且您將看到進度條已填滿。


查看完整回答
反對 回復 2023-06-25
  • 1 回答
  • 0 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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