C#学习相关系列之多线程---TaskCompletionSource用法(八)

一、TaskCompletionSource类的作用

        TaskCompletionSource类回调代码转换为可以等待的Task,TaskCompletionSource本身不是可等待的,它也不是有效的异步方法返回类型。一旦TaskCompletionSource给了你一个任务,你可以简单地返回那个任务,就像你在异步方法中做其他任何事情一样。

二、代码示例

        static void Main(string[] args)
        {

            TaskCompletionSource<bool> tcs1= new TaskCompletionSource<bool>();
            Task.Run( () => ChoiceTicket(tcs1)
           );
            Task.Run( () => 
                PayForMoney(tcs1)
            );

            Console.ReadKey();
        }

          
        static async void PayForMoney(TaskCompletionSource<bool> tcs)
        {
            await tcs2.Task;
            Console.WriteLine("选购支付宝支付");
            tcs.SetResult(true);
            Thread.Sleep(3000);
            Console.WriteLine("支付完成");
            Console.WriteLine("跳到火车票软件完成");

        }
        static async Task<bool> ChoiceTicket(TaskCompletionSource<bool> tcs)
        {
            Console.WriteLine("选购火车票");
            Console.WriteLine("跳转到到支付页面");
            tcs2.SetResult(10);
            await tcs.Task;
            Console.WriteLine("订票完成");
            return tcs.Task.Result;

        }

简单的讲TaskCompletionSource可以实现Task异步等待的功能,await TaskCompletionSource.task会在其他线程TaskCompletionSource.setResult执行后再继续执行。

代码:

 1     private string AwaitByTaskCompleteSource(Func<Task<string>> func)
 2     {
 3         var taskCompletionSource = new TaskCompletionSource<string>();
 4         var task1 = taskCompletionSource.Task;
 5         Task.Run(async () =>
 6         {
 7             var result = await func.Invoke();
 8             taskCompletionSource.SetResult(result);
 9         });
10         var task1Result = task1.Result;
11         Debug.WriteLine($"3. AwaitByTaskCompleteSource end:{task1Result}");
12         return task1Result;
13     }

 var task1Result = task1.Result;会暂停执行,直到taskCompletionSource.SetResult(result);赋值后才会继续执行。Task.result也会实现暂停功能,但是Task无法定义一个可以赋值的全局变量,taskCompletionSource可以不要实体Task的任务,实现暂停功能。

            var tt = Task<int>.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(1);
                }
                return 10;
            });
            var t1 = tt.Result;
            Task.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                } });

var t1 = tt.Result该方法也是Task的一种暂停等待功能,在需要Task.result的地方会卡死等待task执行完后再继续向下执行。该运行结果是先输出1,再输出2,如果没有Task.result代码,则是1和2交替输出。

参考文献:

C# 异步转同步 TaskCompletionSource-CSDN博客

C# dotnet 使用 TaskCompletionSource 实现暂停功能-CSDN博客

C#中的TaskCompletionSource-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值