多重任务层次

时间:2018-07-02 08:13:25

标签: c# multithreading

我想调用一个任务,该任务本身调用一个异步方法,该方法将返回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;

        }

1 个答案:

答案 0 :(得分:0)

由于UpdateValidated已经是异步的,因此您应该直接调用它以执行它。像Task.Factory.StartNewTask.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仅传递结果。