如何将任务链接到它的前一个实例
本文关键字:实例 一个 任务 链接 | 更新日期: 2023-09-27 18:11:36
查找将任务链接到存在的前一个实例。当前,两者是同时执行的。
一个任务的初始代码:
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<int> _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<int> 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<int> 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<int>>
变成Task<int>
。两者都有效,但在这种情况下,我觉得UnWrap
使其意图更清晰。请注意,由于整个事件处理程序将在UI线程中运行,因此不需要同步访问
previousTask
,如果没有,您需要做一些锁定。