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))
                {
                    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);
                }
            }
        }
    }
4

1 回答 1

4

你已经很接近了,但是有一些事情需要修改:

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,如果没有,则需要进行一些锁定。

于 2013-04-29T19:20:51.187 回答