Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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#_.net_Task Parallel Library - Fatal编程技术网

C# 引发异常时,任务未处于错误状态

C# 引发异常时,任务未处于错误状态,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,在以下示例中引发异常(假设engine.Send(…)引发异常),我似乎无法理解为什么我的任务没有处于错误状态: 但我似乎不知道如何将其集成到示例代码中。我是否在开始()之前调用它?在等待()之前 我想让调用程序知道receiverTask抛出了一个异常并失败了。有什么指针吗?如果我正确理解了这个上下文,您可以省去.Start()而使用.Wait()稍微不同一些。 (我不知道你的引擎.Send(someObject)方法是什么,所以我不得不假设。) 假设您的方法返回bool(这没关系,只是为了写

在以下示例中引发异常(假设engine.Send(…)引发异常),我似乎无法理解为什么我的任务没有处于错误状态:

但我似乎不知道如何将其集成到示例代码中。我是否在开始()之前调用它?在等待()之前


我想让调用程序知道receiverTask抛出了一个异常并失败了。有什么指针吗?

如果我正确理解了这个上下文,您可以省去
.Start()
而使用
.Wait()
稍微不同一些。

(我不知道你的
引擎.Send(someObject)
方法是什么,所以我不得不假设。)

假设您的方法返回bool(这没关系,只是为了写下一些东西。

如果是同步的,则返回的任务可以是:

 Task<bool> receiverTask = Task<bool>.Run(async () =>
            await Task<bool>.FromResult(engine.Send(someObject)));
 Task<bool> receiverTask = Task.Run(async () =>
            await engine.Send(someObject));

但您也可以使用Try/Catch块:

 try
 {
    receiverTask.Wait();

    if (receiverTask.Status == TaskStatus.RanToCompletion)
       Console.WriteLine("Completed: {0}  Result: {1}", receiverTask.GetAwaiter().IsCompleted, receiverTask.Result);
 }
 catch (Exception)
 {
    receiverTask.ContinueWith(t =>
    {
       //With continuation
       if (receiverTask.IsFaulted)
          Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
    }, TaskContinuationOptions.OnlyOnFaulted);

       //or without
       //if (receiverTask.IsCanceled)
       //Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
 }

ContinueWith实际上在后台调用Start和Wait方法,因此您可以删除这两个调用并用ContinueWith方法替换它们。请选中ReceiveTask.Result.IsFaulted。该任务失败,而不是ReceiveTask。
 Task<bool> receiverTask = Task.Factory.StartNew(async delegate
 {
    bool _result = await Task<bool>.FromResult(engine.Send(someObject));
    return _result;
 }, TaskScheduler.Default).Unwrap();
 Task<bool> receiverTask = Task.Run(async () =>
            await engine.Send(someObject));
 Task<bool> receiverTask = Task.Factory.StartNew(async delegate
 {
    bool _result = await engine.Send(someObject);
    return _result;
 }, TaskScheduler.Current).Unwrap<bool>();
 receiverTask.ContinueWith(t =>
 {
    //Continue on faulted
    Console.WriteLine(receiverTask.GetAwaiter().IsCompleted);
    if (receiverTask.IsFaulted)
       Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
 }, TaskContinuationOptions.OnlyOnFaulted).Wait(0);

 receiverTask.ContinueWith(t =>
 {
    //Continue on canceled
    Console.WriteLine(receiverTask.GetAwaiter().IsCompleted);
    if (receiverTask.IsCanceled)
       Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
 }, TaskContinuationOptions.OnlyOnCanceled).Wait(0);

 receiverTask.ContinueWith(t =>
 {
    //Standard behaviour
    Console.WriteLine(receiverTask.GetAwaiter().IsCompleted);
    Console.WriteLine(receiverTask.Status.ToString());
 }, TaskContinuationOptions.None).Wait();

 //This writes only if no errors have been raised
 if (receiverTask.Status == TaskStatus.RanToCompletion)
    Console.WriteLine("Completed: {0}  Result: {1}", receiverTask.GetAwaiter().IsCompleted, receiverTask.Result);
 try
 {
    receiverTask.Wait();

    if (receiverTask.Status == TaskStatus.RanToCompletion)
       Console.WriteLine("Completed: {0}  Result: {1}", receiverTask.GetAwaiter().IsCompleted, receiverTask.Result);
 }
 catch (Exception)
 {
    receiverTask.ContinueWith(t =>
    {
       //With continuation
       if (receiverTask.IsFaulted)
          Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
    }, TaskContinuationOptions.OnlyOnFaulted);

       //or without
       //if (receiverTask.IsCanceled)
       //Console.WriteLine(receiverTask.Exception.InnerExceptions[0].Message);
 }