我想调用一个任务,该任务本身调用一个异步方法,该方法将返回bool值。
我想根据这一结果做点事情。
我可以在outcome.Result.Result
上获取数据,但这看起来不太好,我希望在outcome.Result
中获得输出。
我不知道。 有人可以指导。
private void OnValidated(ValidatedIntergrationEvent evt)
{
var outcome=Task.Factory.StartNew(() => mydata.UpdateValidated());
if (outcome.Result.Result)//This work fine but I think I need something to do so that outcome.Result gives my solution.
{ }
else { }
}
public async Task<bool> UpdateValidated()
{
var result= await Mediator.Send(new ValidatedEvent(this));
return result;
}
public async Task<bool> Handle(ValidatedEvent notification, CancellationToken cancellationToken)
{ //dO WORK
// return Task.FromResult(true);
return true;
}
答案 0 :(得分:0)
由于UpdateValidated
已经是异步的,因此您应该直接调用它以执行它。像Task.Factory.StartNew
或Task.Run
之类的东西提供了一种将同步任务放在新线程上的方法,以便它们可以异步运行。因此,您应该直接调用它:
private void OnValidated(ValidatedIntergrationEvent evt)
{
var outcome = mydata.UpdateValidated()
// Note: this WILL block, regardless of how you call the async function
var result = outcome.Result;
}
但是,您应该尝试避免使用.Result
,因为这将阻塞同步功能,直到异步结果准备就绪,甚至可能导致死锁。如果OnValidated
是标准事件处理程序,则您可以可以使其变为异步并等待您的任务:
private async void OnValidated(ValidatedIntergrationEvent evt)
{
var result = await mydata.UpdateValidated()
}
但是,这会使事件处理程序触发并且忘记其中的危险。因此,您应该真正尝试更改在调用异步代码时真正异步运行的代码。
最后,请注意,您可以 使用Task.Run
将异步任务强制到单独的线程上。当异步调用在CPU上也做很多事情时,这很有用:
var outcome = Task.Run(() => mydata.UpdateValidated());
这看起来与您的Task.Factory.StartNew()
通话非常相似,但仅返回Task<bool>
而不是您的Task<Task<bool>>
。这是因为Task.Run
有一个重载,可以使您显式调用异步方法,从而使Task.Run
仅传递结果。