如何将任务链接到它的前一个实例?
希望将任务链接到先前的实例(如果存在)。 目前,两者都是同时执行的。
适用于一项任务的初始代码:
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
而不是await
将Task
转换为> Task
。 两者都有效,但在这种情况下,我觉得UnWrap
的意图更清晰。 -
请注意,由于整个事件处理程序将在UI线程中运行,因此不需要同步对
previousTask
访问,如果不是,则需要进行一些锁定。
- 将标头添加到简单Web服务请求
- 仅当使用NetworkService时,站点才会使用ApplicationPoolIdentity在本地启动:“HTTP错误503.服务不可用”。
- Directory.GetCurrentDirectory()根据命令行参数返回不同的结果
- 异步方法是否正确? Resharper警告
- Howto:Parallel.Foreach在每个进程运行一个新进程(但一次只有一个进程)后执行许多进程?
- MVC4 .NET 4.5异步操作方法不重定向
- 使用.NET 4.5构建的应用程序可以在.NET 4.0上运行吗?
- 使用应用程序设置中的值存储字符串数组
- ReactiveUI 5.0.2中缺少ReactiveAsyncCommand