以下是代码,问题是如何跟踪完成后再运行其他内容?尝试将完成的zip复制到存储位置
private async void ZipFolder(string src, string dest, bool delete)
{
await Task.Run(() =>
{
using (var zipFile = new ZipFile())
{
// add content to zip here
zipFile.AddDirectory(src);
zipFile.SaveProgress +=
(o, args) =>
{
var percentage = (int)(1.0d / args.TotalBytesToTransfer * args.BytesTransferred * 100.0d);
// report your progress
pbCurrentFile.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
lblCurrentFile.Content = "Compressing " + src;
pbCurrentFile.Value = percentage;
}
));
};
zipFile.Save(dest);
if(delete)
{
Directory.Delete(src, true);
}
}
});
}
答案 0 :(得分:7)
该方法应该返回Task
,而不是void
。然后,您可以await
该任务在完成后运行操作,或者如果您想以旧式方式添加延续,则使用ContinueWith
。
此方法也不需要真正的 async
。您只需return
Task.Run
的结果而不是等待它,因为此方法在该调用完成后没有执行任何操作。
此外,一种更惯用的报告进度的方法是,此方法接受IProgress<int>
,其中调用者指示如何使用进度更新UI,而不是将UI代码与业务逻辑混合。 / p>