有一个接受构造函数的类Action<object>
。但我需要在那里传递一个异步方法(即Func<object, Task>
)。创建了一个继承人并在构造函数中尝试执行以下操作
public MyClassAsync(Func<object, Task> execute) :
base (async (o)=>await Task.Factory.StartNew(()=>execute?.Invoke(o)))
{ }
自然地强调async
并写道
异步方法匿名不应该返回 void
那我该怎么办?
这不是编译器错误。据我所知,这只是一个警告,表示编译器不确定在这种情况下如何表现。也就是说,我的代码可以编译、运行,但我不确定它是如何工作的。
更新:
我会告诉你一些例子
这里是https://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.mvvm.relaycommand(v=vs.110).aspx说明在这里RelayCommand
这是构造函数之一
RelayCommand(Action<Object>, Predicate<Object>)
这是https://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.mvvm.asyncrelaycommand(v=vs.110).aspx
AsyncRelayCommand : RelayCommand
这是相应的构造函数
AsyncRelayCommand(Func<Object, Task>, Predicate<Object>, Boolean)
不幸的是,我不知道在哪里查看源代码。但是有些事情告诉我,如果我按照评论中的建议传递给基本构造函数o => Task.Factory.StartNew(...)
,那么我将得到一个非托管任务,我将无法知道它的结束。
UPD2
所以最后我应该上两节课
RelayCommand
和AsyncRelayCommand : RelayCommand
它应该像这样使用
public RelayCommand SomeCommand {get;set;}
public RelayCommand SomeAsyncCommand {get;set;}
public Ctor()
{
SomeCommand = new RelayCommand(AnyMethod, Predicate);
SomeAsyncCommand = new AsyncRelayCommand(AnyMethodAsync, Predicate);
}
async Task AnyMethodAsync()
{
await SomeTask;
UIMethod(); // я должен быть уверен, что этот метод выполнится в UI потоке. Конечно, предполагается, что задача сработала посредством взаимодействия пользователя с интерфейсом (по нажатию кнопки или хоткея или еще как)
}
不可能为 定义一个构造函数AsyncRelayCommand
,因为它应该使用 的基本构造函数RelayCommand
,但它接受Action
(好吧,或者Action<object>
,但这已经是一个可变性问题),并且异步方法必须是类型Func<Task>
(或Func<object,Task>
)
无需创建单独的类来在 UI 线程上运行异步方法。如果将返回值更改为 void,则可以为此使用通常的 RelayCommand:
如果从方法返回 Task 是基本的,那么当从命令调用方法时,您可以简单地忽略它: