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