ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 多线程异常

2020-12-10 17:32:42  阅读:330  来源: 互联网

标签:Task C# try catch task3 var 多线程 异常


using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
static void Main(string [] args)
{
#region Thread里的运行方法如果有异常没有处理会导致控制台程序异常终止
//var thread1 = new Thread(() => TaskMethod("thread1"));
//thread1.Start();

//// 这里try-catch捕获不到异常
//try
//{
// var thread2 = new Thread(() => TaskMethod("thread2"));
// thread2.Start();
//}
//catch(Exception ex)
//{
// Console.WriteLine("{0} 异常,异常信息:{1}", "thread2", ex.Message);
//}
#endregion

#region Task里的运行方法如果有异常但是调用线程如果不去获取任务Task.Result值就不会把task里的异常传播到调用线程,就不会导致控制台程序异常终止
//var task1 = Task.Run(() => TaskMethod("task1"));

//// 这里使用try-catch捕获不到Task里的异常,因为task里的异常没有传播过来
//try
//{
// var task2 = Task.Run(() => TaskMethod("task2"));
//}
//catch(Exception ex)
//{
// Console.WriteLine("{0} 异常,异常信息:{1}", "task2", ex.Message);
//}
#endregion

#region Task里的运行方法有异常,调用线程获取task的Result值会把异常传播给调用线程
//var task3 = Task.Run(() => TaskMethod("task3"));
//var task4 = Task.Run(() => TaskMethod("task4"));

//// 这里获取task3的任务结果Result,会把异常传播过来
//// tyr-catch可以捕获到异常
//try
//{
// var task3Res = task3.Result;
//}
//catch(Exception ex)
//{
// // 输出: "task3 异常,异常信息:One or more errors occurred. (task3 boom)"
// Console.WriteLine("{0} 异常,异常信息:{1}", "task3", ex.Message);
//}

//// 这里获取task3、task4的结果
//// try-catch可以捕获到异常
//try
//{
// var results = Task.WhenAll(task3, task4).Result;
//}
//catch(Exception ex)
//{
// // 输出:"task3,4 异常,异常信息:One or more errors occurred. (task3 boom) (task4 boom)"
// Console.WriteLine("{0} 异常,异常信息:{1}", "task3,4", ex.Message);
//}
#endregion

#region async/await的异步任务里当主调线程使用await等待任务结果时会把异常传播给主调线程
var t1 = AsyncTest("AsyncTask1");
try
{
//var t2 = AsyncTest("AsyncTask2"); // try-catch 不能捕获到异常
var t2 = AsyncTest("AsyncTask2").Result; // try-catch 能捕获到异常,因为 .Result
}
catch(Exception ex)
{
// 输出:"AsyncTask2 发生异常,异常信息:One or more errors occurred. (AsyncTask2 boom)"
Console.WriteLine("{0} 发生异常,异常信息:{1}", "AsyncTask2", ex.Message);
}
#endregion

Console.WriteLine("Main ok");
Console.ReadLine();
}

public async static Task<string> AsyncTest(string taskName)
{
// 由于有await,try-catch可以捕获异常
try
{
var resStr = await Task.Run(() => TaskMethod(taskName));
return resStr; // 这里无法执行,因为 await等待的方法有异常
}
catch(Exception ex)
{
// 输出: "AsyncTask1 发生异常,异常信息:AsyncTask1 boom"
Console.WriteLine("{0} 发生异常,异常信息:{1}", taskName, ex.Message);
}
var resStr1 = await Task.Run(() => TaskMethod(taskName));
return resStr1; // 这里无法执行,因为 await等待的方法有异常
}

public static string TaskMethod(string taskName)
{
Thread.Sleep(1000);
Console.WriteLine("{0} running ", taskName);

throw new Exception(string.Format("{0} boom", taskName));

return taskName + " ok";
}

}

标签:Task,C#,try,catch,task3,var,多线程,异常
来源: https://www.cnblogs.com/tomorrow0/p/14116306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有