gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:23:29 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com