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));
}
}
這應該會產生一個可行的解決方案,其中兩個表單都將保持響應,并且您將看到進度條已填滿。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報