Await Task.Run等到完成然后再做一个动作

时间:2014-04-14 17:59:41

标签: c# async-await

以下是代码,问题是如何跟踪完成后再运行其他内容?尝试将完成的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);
            }

        }

    });
}

1 个答案:

答案 0 :(得分:7)

该方法应该返回Task,而不是void。然后,您可以await该任务在完成后运行操作,或者如果您想以旧式方式添加延续,则使用ContinueWith

此方法也不需要真正的 async。您只需return Task.Run的结果而不是等待它,因为此方法在该调用完成后没有执行任何操作。

此外,一种更惯用的报告进度的方法是,此方法接受IProgress<int>,其中调用者指示如何使用进度更新UI,而不是将UI代码与业务逻辑混合。 / p>