将任务传递给任务 属性

Pass a task to a task property

所以我有一个任务,需要一个路径并打开文件。

private async Task OpenFileAsync(string strFilePath)
{
     doTheOpenThing.
}

直到现在这是一个 void 函数,一切正常,但知道我们需要支持大文件并且我们想使用其他线程打开文件,以免阻塞 UI 线程。

我在我的应用程序中使用 reactiveui,我有一个方法可以侦听任务并在任务到来时运行它们。

        _sessionContext.WhenAnyValue(t => t.NotifyNewTreadTask).Where(t => t != null).Subscribe(t => DoAsyncTask(t));

哪里

   private async void DoAsyncTask(Task task)
        {
            if (task != null)
            {
                await DoThreadAction(() => task);
            }

            _sessionContext.NotifyNewTreadTask = null;
        }

而 DoThreadAction 只是运行任务

await Task.Run(async () => await action.Invoke());

现在我的问题是分配 NotifyNewTreadTask

每当我做 NotifyNewTreadTask = OpenFileAsync(path);

它只运行 OpenFileAsync 任务。如何在没有 运行 的情况下将 OpenFileASync 任务传递给 NotifyNewTreadTask。

Task? NotifyNewTreadTask { get; set; } NotifyNewTreadTask is a property.

您应该使用命令异步执行 OpenFileAsync 而不是在 Subscribe 方法中调用它:

 public class ViewModel
 {
    public ViewModel()
    {
        OpenFile = ReactiveCommand.CreateFromTask<string>(OpenFileAsync);
    }

    public ReactiveCommand<string, Unit> OpenFile { get; }

    private async Task OpenFileAsync(string strFilePath)
    {
        //...
    }
}

而不是设置一些 属性,您可以直接执行 then 任务并等待它:

await OpenFile.Execute("file.txt");

您当然也可以通过设置某些 属性 来调用它:

this.WhenAnyValue(x => x.SomeStringProperty).InvokeCommand(OpenFile);

Task 属性 设置为 Task 以导致另一个 Task 被执行似乎有点笨拙。