首页 / C# / c# – 异常处理:线程v / s任务
c# – 异常处理:线程v / s任务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 异常处理:线程v / s任务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1358字,纯文字阅读大概需要2分钟。
内容图文
线程版本导致未处理的异常,这会导致应用程序崩溃但任务版本不会崩溃.两者都运行完全相同的方法有人可以解释异常行为的这种差异的原因吗?
线程版本:
try
{
new Thread(new ThreadStart(DoWork)).Start(); // do work throws exception
}
catch (Exception e)
{
Console.WriteLine(e);
}
static void DoWork()
{
Console.WriteLine("in thread");
throw new Exception();
}
任务版本:
var errorTask = Task.Factory.StartNew<Func<string>>(() =>
{
Console.WriteLine("in task");
throw new Exception();
});
try
{
string result = errorTask.Result();
}
catch (Exception e)
{
Console.WriteLine(e);
}
解决方法:
Thread.Start启动新线程,但是你在另一个线程中处理异常:
try
{
// DoWork throws exception in new thread;
// threads don't catch exceptions out-of-the-box
new Thread(new ThreadStart(DoWork)).Start();
}
catch (Exception e)
{
// you're handling exception in "old" thread
Console.WriteLine(e);
}
Task.Factory.StartNew启动新任务.任务捕获其中的异常以设置其Status属性:
var errorTask = Task.Factory.StartNew<Func<string>>(() =>
{
Console.WriteLine("in task");
// this exception will be caught in Task's base code,
// since tasks catch exceptions thrown by task methods;
// note, that this will be wrapped into AggregateException
throw new Exception();
});
当你试图获得Task.Result,并且任务处于故障状态时,它只会重新抛出异常:
// this will re-throw exception in calling thread
string result = errorTask.Result;
这就是为什么你的第二次捕获它.
内容总结
以上是互联网集市为您收集整理的c# – 异常处理:线程v / s任务全部内容,希望文章能够帮你解决c# – 异常处理:线程v / s任务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。