当前位置: 首页 > news >正文

C#Winform常见的多线程实现方法:

在 C# WinForms 应用程序中使用多线程可以提高应用程序的响应速度和性能,特别是在处理耗时操作时。WinForms 提供了多种方式来实现多线程,包括使用 Thread 类、BackgroundWorker 类、Task 类和 async/await 关键字等。

下面是一些常见的多线程实现方法:

  1. 使用 Thread 类
    Thread 类是最基本的多线程实现方式。下面是一个简单的示例,展示如何在 WinForms 应用程序中使用 Thread 类来执行后台操作。

using System;
using System.Threading;
using System.Windows.Forms;

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private void buttonStart_Click(object sender, EventArgs e)
{Thread thread = new Thread(new ThreadStart(LongRunningOperation));thread.Start();
}private void LongRunningOperation()
{// 模拟耗时操作Thread.Sleep(5000);// 在主线程上更新UIthis.Invoke((MethodInvoker)delegate{labelStatus.Text = "操作完成";});
}

}
2. 使用 BackgroundWorker 类
BackgroundWorker 类提供了一种简单的方法来执行后台操作并在完成后更新 UI。它还支持进度报告和取消操作。

using System;
using System.ComponentModel;
using System.Windows.Forms;

public partial class MainForm : Form
{
private BackgroundWorker backgroundWorker;

public MainForm()
{InitializeComponent();backgroundWorker = new BackgroundWorker();backgroundWorker.DoWork += BackgroundWorker_DoWork;backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
}private void buttonStart_Click(object sender, EventArgs e)
{if (!backgroundWorker.IsBusy){backgroundWorker.RunWorkerAsync();}
}private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{// 模拟耗时操作System.Threading.Thread.Sleep(5000);
}private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{labelStatus.Text = "操作完成";
}

}
3. 使用 Task 类和 async/await 关键字
Task 类和 async/await 关键字是现代 C# 中推荐的异步编程方式。它们使代码更易读,并且避免了回调地狱。

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private async void buttonStart_Click(object sender, EventArgs e)
{await Task.Run(() => LongRunningOperation());labelStatus.Text = "操作完成";
}private void LongRunningOperation()
{// 模拟耗时操作System.Threading.Thread.Sleep(5000);
}

}
4. 使用 Task 类和 Progress 报告进度
如果你需要在后台操作中报告进度,可以使用 Progress 类。

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private async void buttonStart_Click(object sender, EventArgs e)
{var progress = new Progress<int>(percent =>{progressBar.Value = percent;});await Task.Run(() => LongRunningOperation(progress));labelStatus.Text = "操作完成";
}private void LongRunningOperation(IProgress<int> progress)
{for (int i = 0; i <= 100; i++){// 模拟耗时操作System.Threading.Thread.Sleep(50);progress.Report(i);}
}

}
总结
在 WinForms 应用程序中使用多线程可以显著提高应用程序的响应速度和性能。你可以根据具体需求选择合适的多线程实现方式,如 Thread 类、BackgroundWorker 类、Task 类和 async/await 关键字等。现代 C# 推荐使用 Task 类和 async/await 关键字,因为它们使代码更易读,并且更容易处理异步操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nacos Spring cloud 报错 URI is not absolute、service not found、502 bad gateway
  • C++中string的简单实现
  • R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例
  • 微信小程序npm扩展能力探究
  • CCS10导入CCS3.3工程
  • 287. 寻找重复数(stl法)
  • 【机器学习】和【人工智能】在量子力学的应用及代码案例分析
  • Spring Cloud 八股文
  • 【笔记】物理化学绪论
  • 【video clips 专栏 2 -- videopad 视频拼接】
  • 【LLM】局域网内为容器服务启用HTTPS
  • Spring中Bean的相关注解
  • ROM修改进阶教程------如何修改固件 线刷转卡刷 卡刷转线刷 操作中的一些注意事项
  • C++20中头文件bit的使用
  • k8s的环境配置
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Amaple教程】5. 插件
  • iOS 颜色设置看我就够了
  • leetcode讲解--894. All Possible Full Binary Trees
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Python - 闭包Closure
  • 阿里云前端周刊 - 第 26 期
  • 二维平面内的碰撞检测【一】
  • 工程优化暨babel升级小记
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一个JAVA程序员成长之路分享
  • 字符串匹配基础上
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四) 虚拟摄像头vivi体验
  • (四)汇编语言——简单程序
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Core Web APi类库如何内嵌运行?
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net web项目 调用webService
  • .Net Winform开发笔记(一)
  • .net 调用php,php 调用.net com组件 --
  • .NET 读取 JSON格式的数据
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net语言中的StringBuilder:入门到精通
  • .Net中的集合
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(4)
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [Day 8] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • [Excel] vlookup函数