C# Task异步同步机制

1.引入第三方工具包:Nito.AsyncEx;

AsyncLock:

复制代码
 1 using Microsoft.VisualBasic.Devices;
 2 using Nito.AsyncEx;
 3 using System.Diagnostics;
 4 
 5 namespace WinFormsApp2
 6 {
 7     public partial class Form1 : Form
 8     {
 9         public Form1()
10         {
11             InitializeComponent();
12         }
13 
14         AsyncLock mutex =new AsyncLock();
15         private async void button1_Click(object sender, EventArgs e)
16         {
17             var tasks=Enumerable.Range(1,10).Select(x=>ComputerAsync(x, mutex)).ToList();
18             var result = await Task.WhenAll(tasks);
19             Debug.WriteLine(string.Join(",", result));
20         }
21 
22         private async Task<int> ComputerAsync(int x, AsyncLock mutex)
23         {
24             using (await mutex.LockAsync())
25             {
26                 await Task.Delay(200);
27                 return x * x;
28             };
29         }
30     }
31 }
复制代码

2.SemaphoreSlim

复制代码
 1  SemaphoreSlim SemaphoreSlim= new SemaphoreSlim(1,2);
 2 
 3  private async void button1_Click(object sender, EventArgs e)
 4  {
 5      var start = Stopwatch.GetTimestamp();
 6      var tasks=Enumerable.Range(1,10).Select(x=>ComputerAsync(x, mutex)).ToList();
 7      var result = await Task.WhenAll(tasks);
 8      var time = Stopwatch.GetTimestamp() - start;
 9      Debug.WriteLine(string.Join(",", result)+ time);
10  }
11 
12  private async Task<int> ComputerAsync(int x, AsyncLock mutex)
13  {
14      await SemaphoreSlim.WaitAsync();
15            await Task.Delay(2000);
16      SemaphoreSlim.Release();
17          return x * x;
18      
19  }
复制代码

3.AsyncAutoResetEvent,AsyncManualResetEvent

复制代码
 1  AsyncAutoResetEvent AsyncAutoResetEvent=new AsyncAutoResetEvent(false);
 2  AsyncManualResetEvent AsyncManualResetEvent=new AsyncManualResetEvent(false);
 3  private async void button1_Click(object sender, EventArgs e)
 4  {
 5      AsyncAutoResetEvent.Set();
 6      var start = Stopwatch.GetTimestamp();
 7      var tasks=Enumerable.Range(1,10).Select(x=>ComputerAsync(x, mutex)).ToList();
 8      var result = await Task.WhenAll(tasks);
 9      var time =TimeSpan.FromMilliseconds( Stopwatch.GetTimestamp() - start);
10      Debug.WriteLine(string.Join(",", result)+"  time:" +time);
11  }
12  private async Task<int> ComputerAsync(int x, AsyncLock mutex)
13  {
14      await AsyncAutoResetEvent.WaitAsync();
15      await Task.Delay(500);
16       AsyncAutoResetEvent.Set();
17      return x * x;
18 
19  }
复制代码

4.TaskCompletionSource

复制代码
 1 TaskCompletionSource<string> tcs = new();
 2 private void button2_Click(object sender, EventArgs e)
 3 {
 4     var task1 = Task.Run(() =>
 5     {
 6         Thread.Sleep(2000);
 7         tcs.SetResult("Hello");
 8     });
 9 
10     var task2 = Task.Run(async () =>
11     {
12         var result=await tcs.Task;
13         Debug.WriteLine($"第一个线程完了。。。。{result}");
14 
15     });
16     Task.WhenAll(task1, task2);
17 }
复制代码

5.Await本身也是异步同步的功能

复制代码
 1  private void button2_Click(object sender, EventArgs e)
 2  {
 3      var task1 = Task.Run(() =>
 4      {
 5          Thread.Sleep(2000);
 6          tcs.SetResult("Hello");
 7      });
 8 
 9      var task2 = Task.Run(async () =>
10      {
11          await task1;
12          Debug.WriteLine($"第一个线程完了。。。。");
13 
14      });
15      Task.WhenAll(task1, task2);
16  }
复制代码

 

posted @   小码哥-风云  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示