并发编程尝试
网上搜到很多理论,没有实际的例子,自己尝试写一写
.Net Framework 4.5
VS 2017
WinForm 项目
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Win.Order.Thread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //跨线程调用控件检查=取消 CheckForIllegalCrossThreadCalls = false; } private async void button1_Click(object sender, EventArgs e) { var num = int.Parse(textBox1.Text); await Task.Run(() => { StringBuilder sb = new StringBuilder(); //多线程并发,乱序执行 Parallel.For(0, num, (i) => { var api = new Api(); string str = api.OrderAction(i); sb.AppendLine(str); }); //放到上面循环里会卡死,就放到外面了 richTextBox1.AppendText(sb.ToString()); //滚动条滚到最底部 richTextBox1.ScrollToCaret(); }); } private void button2_Click(object sender, EventArgs e) { richTextBox1.Clear(); } } public class Api { //唯一记录(来一个记录一个,不移除) public static System.Collections.Concurrent.ConcurrentQueue<int> list1 = new System.Collections.Concurrent.ConcurrentQueue<int>(); //处理中(拿一个,少一个 static System.Collections.Concurrent.ConcurrentQueue<int> list2 = new System.Collections.Concurrent.ConcurrentQueue<int>(); //处理完成(完成一个记录一个) static System.Collections.Concurrent.ConcurrentQueue<int> list3 = new System.Collections.Concurrent.ConcurrentQueue<int>(); static object lockObj = new object(); static bool IsExecuting = false; public string OrderAction(int id) { if (list3.Contains(id)) { return $"{id}已处理完成,不要重复提交"; } if (list2.Contains(id)) // { return $"{id}已加入排队处理1"; } if (list1.Contains(id)) { } else { list1.Enqueue(id); list2.Enqueue(id); } if (IsExecuting && !list2.Contains(id) && !list3.Contains(id)) { return $"{id}正在处理"; } if (IsExecuting) { return $"{id}已加入排队处理2"; } lock (lockObj) { if (IsExecuting) { return $"{id}已加入排队处理3"; } else { IsExecuting = true; //一个一个执行 Task.Run(() => { //IsExecuting = true; //多个一起执行 while (list2.TryDequeue(out int first)) { System.Threading.Thread.Sleep(5000); list3.Enqueue(first); } IsExecuting = false; }); return $"{id}已加入排队处理4"; } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述