C#多线程异常处理(五)
我在从Task捕获异常时遇到问题.运行我更改了代码,问题解决了.我愿意找出以两种方式运行Task.Run中的异常之间的区别:
在Outside函数中,我无法捕获异常,但在Inside函数中,我可以捕获异常.
void Outside()
{
try
{
Task.Run(() =>
{
int z = 0;
int x = 1 / z;
});
}
catch (Exception exception)
{
MessageBox.Show("Outside : " + exception.Message);
}
}
void Inside()
{
Task.Run(() =>
{
try
{
int z = 0;
int x = 1 / z;
}
catch (Exception exception)
{
MessageBox.Show("Inside : "+exception.Message);
}
});
}
解决方案
运行任务时,它所引发的任何异常都将保留,并在某些等待任务结果或任务完成的情况下重新抛出. >
Task.Run()返回一个可用于执行此操作的Task对象,因此:
var task = Task.Run(...)
try
{
task.Wait(); // Rethrows any exception(s).
...
对于较新版本的C#,您可以使用await而不是Task.Wait():
try
{
await Task.Run(...);
...
整整齐齐.
为完整起见,这是一个可编译的控制台应用程序,演示了await的用法:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
test().Wait();
}
static async Task test()
{
try
{
await Task.Run(() => throwsExceptionAfterOneSecond());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static void throwsExceptionAfterOneSecond()
{
Thread.Sleep(1000); // Sleep is for illustration only.
throw new InvalidOperationException("Ooops");
}
}
}
浙公网安备 33010602011771号