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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)