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

ond*_*vic 0 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);
            }

        }

    });
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 7

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

这种方法也没有实际需要async.你可以只是return结果Task.Run而不是等待它,因为这个方法在调用结束后没有做任何事情.

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

  • @ondrovic 我对您对代码进行我所描述的更改的能力充满信心。这些更改通常简短而简单,如果您遇到困难,您可以通过其他研究找到有关这些主题的更多信息。如果我只是给您提供可以复制粘贴的代码,您将无法有效地学习如何将这些概念应用到您的代码中。 (2认同)