因此,我有一个任务,它需要一个路径并打开文件。
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/