Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多层次任务_C#_Multithreading - Fatal编程技术网

C# 多层次任务

C# 多层次任务,c#,multithreading,C#,Multithreading,我想调用一个任务,该任务本身调用一个异步方法,该方法返回bool值。 我想在这个结果的基础上做点什么。 我可以在output.Result.Result上获得数据,但这看起来不太好,我希望在output.Result中获得输出 我想不出来。 有人能给我引路吗 private void OnValidated(ValidatedIntergrationEvent evt) { var outcome=Task.Factory.StartNe

我想调用一个任务,该任务本身调用一个异步方法,该方法返回bool值。 我想在这个结果的基础上做点什么。 我可以在
output.Result.Result
上获得数据,但这看起来不太好,我希望在
output.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;

        }
private void OnValidated(ValidatedIntergrationEvent evt)
{
var output=Task.Factory.StartNew(()=>mydata.UpdateValidated());
if(output.Result.Result)//这项工作很好,但我想我需要做点什么,这样output.Result就会给出我的解决方案。
{ }
else{}
}
公共异步任务UpdateValidated()
{
var result=await Mediator.Send(new ValidatedEvent(this));
返回结果;
}
公共异步任务句柄(ValidateEvent通知、CancellationToken CancellationToken)
{//工作
//返回Task.FromResult(true);
返回true;
}

因为
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
而不是
Task
。这是因为
Task.Run
有一个重载,它显式地允许您调用异步方法,从而使
Task.Run
只传递结果。

不要使用
Task.Factory.StartNew
启动运行任务的新任务。直接调用
UpdateValidated()
。另外,尽量避免使用
.Result
。改为使您的代码完全异步。如果我删除Task.Factory.StartNew.,它仍然是异步的。我希望它在线程中,这样它就不会阻止任何东西。您正在调用异步方法,所以是的,这将是异步的。如果你想强制它在一个新线程上运行,你可以启动一个新任务,但是任务本身应该是异步的(
task.Run(async()=>wait myData.UpdateValidated())
),非常感谢。但是我不能接受这个答案,因为它在注释中。另外,你能解释一下为什么我的代码错误,以供将来参考吗,您的代码现在很难阅读,因为缩进已损坏。用
{}
按钮练习一下。这很容易做到正确,这让更多的人阅读它。