C#多线程学习笔记七

获取Task的返回值

Task<int> task = Task.Factory.StartNew(()=> { return 1; });
task.Wait();
Console.WriteLine(task.Result);


获取ContinueWith的返回值

Task<int> task = Task.Factory.StartNew(()=> { return 1; });
var task2 = task.ContinueWith<int>((t)=> 
{
var num = t.Result + 10;
return num; 
});
Console.WriteLine(task2.Result);

获取WhenAll/WhenAny的返回值

Task<int> task1 = Task.Factory.StartNew(() => { return 1; });
Task<int> task2 = Task.Factory.StartNew(() => { return 2; });
var tasks = new Task<int>[2] {task1,task2 };
var task = Task.WhenAll<int>(tasks);
int[] result = task.Result;

异常

1.什么时候抛出异常:
Wait操作,TResult操作
2.何时会有多个异常在AggregateException中以及如何去获取所有的异常
AggregateException 是一个集合,因为Task中可能会抛出多个异常,所以用一种新的类型把这些异常都追加到一个集合中。对应以下这段代码:

var task = Task.Factory.StartNew(()=> 
{
var childTask1 = Task.Factory.StartNew(() =>
{
throw new Exception("task1 Exception");
}, TaskCreationOptions.AttachedToParent);
    var childTask2 = Task.Factory.StartNew(() =>
{
throw new Exception("task2 Exception");
     }, TaskCreationOptions.AttachedToParent);
});
try
{
   task.Wait();
}
catch (AggregateException ex)
{
   foreach (var item in ex.InnerExceptions)
   {
      Console.WriteLine(string.Format("message={0},type={1}", 
                                      item.InnerException.Message, item.GetType().Name));
   }
}

3.Handle方法

try
{
   try
   {
      task.Wait();
   }
   catch (AggregateException ex)
   {
      ex.Handle(x =>
      {
         if (x.InnerException.Message == "task1 Exception")
         {
            return true;
         }
         return false;
      });
   }
}
catch (AggregateException ex) { }

当前的Handle就是来遍历异常数组的,如果有一个异常信息是符合要求的,便认为是已经处理的,返回true,如果觉得异常还需要上抛,请返回false。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值