C# 多线程示例:使用 Thread 类实现并发操作
C#/r/nnamespace Threaddemo/r/n{/r/n public partial class MainForm : Form/r/n {/r/n private Thread thread1, thread2, thread3;/r/n private DateTime startTime;/r/n/r/n public MainForm()/r/n {/r/n InitializeComponent();/r/n }/r/n/r/n private void MainForm_Load(object sender, EventArgs e)/r/n {/r/n // 初始化线程/r/n thread1 = new Thread(new ThreadStart(Worker1));/r/n thread2 = new Thread(new ThreadStart(Worker2));/r/n thread3 = new Thread(new ThreadStart(Worker3));/r/n }/r/n/r/n private void button1_Click(object sender, EventArgs e)/r/n {/r/n // 开始运行三个线程/r/n startTime = DateTime.Now;/r/n thread1.Start();/r/n thread2.Start();/r/n thread3.Start();/r/n }/r/n/r/n private void Worker1()/r/n {/r/n // 线程1的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label1, DateTime.Now.Subtract(startTime).ToString(@/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void Worker2()/r/n {/r/n // 线程2的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label2, DateTime.Now.Subtract(startTime).ToString(@/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void Worker3()/r/n {/r/n // 线程3的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label3, DateTime.Now.Subtract(startTime).ToString(@/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void UpdateLabel(Label label, string text)/r/n {/r/n // 更新 Label 的文本/r/n if (label.InvokeRequired)/r/n {/r/n label.Invoke(new Action<Label, string>(UpdateLabel), label, text);/r/n }/r/n else/r/n {/r/n label.Text = text;/r/n }/r/n }/r/n }/r/n}/r/nnamespace Threaddemo/r/n{/r/n internal static class Program/r/n {/r/n /// <summary>/r/n /// 应用程序的主入口点。/r/n /// </summary>/r/n [STAThread]/r/n static void Main()/r/n {/r/n Application.EnableVisualStyles();/r/n Application.SetCompatibleTextRenderingDefault(false);/r/n Application.Run(new MainForm());/r/n }/r/n }/r/n}/r/n/r/n/r/n代码说明:/r/n/r/n1. 创建三个 Thread 对象,分别用于执行 Worker1、Worker2 和 Worker3 方法。/r/n2. 使用 ThreadStart 委托将方法传递给 Thread 对象。/r/n3. 通过 button1_Click 事件启动三个线程。/r/n4. Worker 方法中使用 DateTime.Now.Subtract(startTime).TotalSeconds 计算运行时间,并使用 UpdateLabel 方法更新 UI 元素。/r/n5. UpdateLabel 方法使用 InvokeRequired 属性判断是否需要跨线程访问 UI 元素,并使用 Invoke 方法安全地更新 Label 文本。/r/n/r/n修复问题:/r/n/r/n在 Application.Run() 方法中,需要将 Form1 改为 MainForm,因为 MainForm 是实际的窗体类名。/r/n/r/n其他建议:/r/n/r/n* 使用 async/await 简化代码,避免使用 Thread 类进行显式线程管理。/r/n* 使用 Task 类代替 Thread 类,以提高性能和效率。/r/n* 使用 CancellationToken 取消线程执行。/r/n* 使用 BackgroundWorker 类在后台线程中执行长时间运行的任务,并更新 UI 元素。/r/n* 使用 ThreadPool 类管理线程池,提高线程利用率。/r/n* 使用 lock 关键字或其他同步机制保护共享资源。/r/n* 使用 SynchronizationContext 类进行跨线程访问 UI 元素。/r/n* 使用 Task.Run 方法在后台线程中执行任务,并使用 await 关键字等待任务完成。/r/n* 使用 Parallel.For 或 Parallel.ForEach 方法并行处理数据。', 'content': 'C#/r/nnamespace Threaddemo/r/n{/r/n public partial class MainForm : Form/r/n {/r/n private Thread thread1, thread2, thread3;/r/n private DateTime startTime;/r/n/r/n public MainForm()/r/n {/r/n InitializeComponent();/r/n }/r/n/r/n private void MainForm_Load(object sender, EventArgs e)/r/n {/r/n // 初始化线程/r/n thread1 = new Thread(new ThreadStart(Worker1));/r/n thread2 = new Thread(new ThreadStart(Worker2));/r/n thread3 = new Thread(new ThreadStart(Worker3));/r/n }/r/n/r/n private void button1_Click(object sender, EventArgs e)/r/n {/r/n // 开始运行三个线程/r/n startTime = DateTime.Now;/r/n thread1.Start();/r/n thread2.Start();/r/n thread3.Start();/r/n }/r/n/r/n private void Worker1()/r/n {/r/n // 线程1的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label1, DateTime.Now.Subtract(startTime).ToString(/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void Worker2()/r/n {/r/n // 线程2的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label2, DateTime.Now.Subtract(startTime).ToString(/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void Worker3()/r/n {/r/n // 线程3的工作/r/n while (DateTime.Now.Subtract(startTime).TotalSeconds < 60)/r/n {/r/n UpdateLabel(label3, DateTime.Now.Subtract(startTime).ToString(/'hh/:mm/:ss/'));/r/n }/r/n }/r/n/r/n private void UpdateLabel(Label label, string text)/r/n {/r/n // 更新 Label 的文本/r/n if (label.InvokeRequired)/r/n {/r/n label.Invoke(new Action<Label, string>(UpdateLabel), label, text);/r/n }/r/n else/r/n {/r/n label.Text = text;/r/n }/r/n }/r/n }/r/n}/r/nnamespace Threaddemo/r/n{/r/n internal static class Program/r/n {/r/n /// <summary>/r/n /// 应用程序的主入口点。/r/n /// </summary>/r/n [STAThread]/r/n static void Main()/r/n {/r/n Application.EnableVisualStyles();/r/n Application.SetCompatibleTextRenderingDefault(false);/r/n Application.Run(new MainForm());/r/n }/r/n }/r/n}/r/n/r/n/r/n代码说明:/r/n/r/n1. 创建三个 Thread 对象,分别用于执行 Worker1、Worker2 和 Worker3 方法。/r/n2. 使用 ThreadStart 委托将方法传递给 Thread 对象。/r/n3. 通过 button1_Click 事件启动三个线程。/r/n4. Worker 方法中使用 DateTime.Now.Subtract(startTime).TotalSeconds 计算运行时间,并使用 UpdateLabel 方法更新 UI 元素。/r/n5. UpdateLabel 方法使用 InvokeRequired 属性判断是否需要跨线程访问 UI 元素,并使用 Invoke 方法安全地更新 Label 文本。/r/n/r/n修复问题:/r/n/r/n在 Application.Run() 方法中,需要将 Form1 改为 MainForm,因为 MainForm 是实际的窗体类名。/r/n/r/n其他建议:/r/n/r/n* 使用 async/await 简化代码,避免使用 Thread 类进行显式线程管理。/r/n* 使用 Task 类代替 Thread 类,以提高性能和效率。/r/n* 使用 CancellationToken 取消线程执行。/r/n* 使用 BackgroundWorker 类在后台线程中执行长时间运行的任务,并更新 UI 元素。/r/n* 使用 ThreadPool 类管理线程池,提高线程利用率。/r/n* 使用 lock 关键字或其他同步机制保护共享资源。/r/n* 使用 SynchronizationContext 类进行跨线程访问 UI 元素。/r/n* 使用 Task.Run 方法在后台线程中执行任务,并使用 await 关键字等待任务完成。/r/n* 使用 Parallel.For 或 Parallel.ForEach 方法并行处理数据。
原文地址: https://www.cveoy.top/t/topic/mF7q 著作权归作者所有。请勿转载和采集!