如何将任务链接到它的前一个实例?

希望将任务链接到先前的实例(如果存在)。 目前,两者都是同时执行的。

适用于一项任务的初始代码:

private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) { var dialog = GetDefaultOpenFileDialog(); using (dialog) { if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { using (var progress = new SimpleProgress(this)) { int addFiles = await _context.AddFiles(dialog.FileNames, progress); Console.WriteLine("Files added: {0}", addFiles); } } } } 

试图使它工作失败:

  Task _files; private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) { var dialog = GetDefaultOpenFileDialog(); using (dialog) { if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { using (var progress = new SimpleProgress(this)) { int addFiles; Task files = _context.AddFiles(dialog.FileNames, progress); if (_files == null) { _files = files; } else { var task1 = await _files.ContinueWith(task => _context.AddFiles(dialog.FileNames, new SimpleProgress(this))); } addFiles = await _files; Console.WriteLine("Files added: {0}", addFiles); } } } } 

你非常接近,但有一些事情需要修改:

 private Task previousTask = Task.FromResult(0); private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) { var dialog = GetDefaultOpenFileDialog(); using (dialog) { if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { using (var progress = new SimpleProgress(this)) { previousTask = previousTask.ContinueWith(t => _context.AddFiles(dialog.FileNames, progress)) .UnWrap(); ; int addFiles = await previousTask; Console.WriteLine("Files added: {0}", addFiles); } } } } 

注意事项:

  • 有时将上一个任务置为null ,而不是将其初始化为已完成的任务( Task.FromResult(0) )。 这避免了空检查代码。

  • 你两次调用AddFiles 。 您不应该在if之前调用它,并且您没有将任务分配给if的实例字段。

  • 我使用UnWrap而不是awaitTask>转换为Task 。 两者都有效,但在这种情况下,我觉得UnWrap的意图更清晰。

  • 请注意,由于整个事件处理程序将在UI线程中运行,因此不需要同步对previousTask访问,如果不是,则需要进行一些锁定。