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

本文关键字:实例 一个 任务 链接 | 更新日期: 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代替awaitTask<Task<int>>变成Task<int>。两者都有效,但在这种情况下,我觉得UnWrap使其意图更清晰。

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