wpf - 将任务传递给任务属性

标签 wpf multithreading task reactiveui

因此,我有一个任务,它需要一个路径并打开文件。

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

到目前为止,这是一个void函数,一切正常,但是知道我们需要支持大文件,并且我们希望使用其他线程来打开文件,以便不阻塞UI线程。

我在应用程序中使用了reactui,并且有一种方法可以监听任务并在任务出现时运行它们。
        _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)
    {
        //...
    }
}

无需设置某些属性,您可以直接执行然后执行任务并等待它:
await OpenFile.Execute("file.txt");

当然,由于设置了某些属性,您可能还会调用它:
this.WhenAnyValue(x => x.SomeStringProperty).InvokeCommand(OpenFile);

但是,将Task属性设置为Task会导致另一个Task被执行似乎有些笨拙。

关于wpf - 将任务传递给任务属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62065176/

相关文章:

c# - 从 TreeView 中绑定(bind)到命令

.net - 只为几个可用核心创建大量任务是一个坏主意吗?

C# 如何等待返回 Task<dynamic> 的方法?

python - 运行更多任务的 Celery 任务

linux - WPF 应用程序可以在 Linux 或 Mac 上运行 .Net Core 3 吗?

wpf - WPF 与 Winforms 中的窗口透明度

c# - 在 Caliburn.micro 中设置初始窗口大小

multithreading - 系统.InvalidCastException : Specified cast is not valid

Java EE future 的空指针

c++ - 用于 C++ 的 ConcurrentHashMap