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 关注
- 104 浏览
添加回答
举报