将任务传递给任务 属性
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
被执行似乎有点笨拙。
所以我有一个任务,需要一个路径并打开文件。
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
被执行似乎有点笨拙。