C# 多线程窗体的创建
2023-09-14 09:02:24 时间
从目前已经在项目中工作将近一个月来的情况来看,凡是费时的操作,基本上都要用到多线程的等待窗体、进度提示窗体等实时显示动态的进度信息。而如果直接在主线程的窗体上实时更新信息,就会造成更新太快或者太慢而出现的进程假死现象。为了缓解这些情况,本文就参考一些文章,把他们的智慧总结于此。希望对大家有所帮助。
一、多线程中创建等待窗体
在winform程序开发中,计算机经常会执行一些比较耗时的任务,如大量数据的查询操作、较为复杂的业务处理等,这些任务往往需要耗时几秒到几十秒钟的时间,在这些任务执行期间winform程序窗体不再响应任何鼠标和键盘事件,出现假死状态,用户体验很差。
一个比较好的解决办法是,在这些任务执行期间在界面前端显示一个等待窗体,告诉用户任务正在执行中。
1.1 开发等待窗体
窗体中有一个PictureBox控件和两个Lable控件,PictureBox控件的Image属性为一张动态图片。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using NavManager.Common; namespace NavManager.Utils { public partial class WaitForm : Form { public WaitForm() { InitializeComponent(); SetText(""); } private delegate void SetTextHandler(string text); public void SetText(string text) { if (this.label2.InvokeRequired) { this.Invoke(new SetTextHandler(SetText), text); } else { this.label2.Text = text; } } } }
1.2 提供访问等待窗体的接口
编写类WaitFormService
using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Windows.Forms; namespace NavManager.Utils { /// <summary> /// Using Singleton Design Pattern /// </summary> public class WaitFormService { public static void CreateWaitForm() { WaitFormService.Instance.CreateForm(); } public static void CloseWaitForm() { WaitFormService.Instance.CloseForm(); } public static void SetWaitFormCaption(string text) { WaitFormService.Instance.SetFormCaption(text); } private static WaitFormService _instance; private static readonly Object syncLock = new Object(); public static WaitFormService Instance { get { if (WaitFormService._instance == null) { lock (syncLock) { if (WaitFormService._instance == null) { WaitFormService._instance = new WaitFormService(); } } } return WaitFormService._instance; } } private WaitFormService() { } private Thread waitThread; private WaitForm waitForm; public void CreateForm() { if (waitThread != null) { try { waitThread.Abort(); } catch (Exception) { } } waitThread = new Thread(new ThreadStart(delegate() { waitForm = new WaitForm(); Application.Run(waitForm); })); waitThread.Start(); } public void CloseForm() { if (waitThread != null) { try { waitThread.Abort(); } catch (Exception) { } } } public void SetFormCaption(string text) { if (waitForm != null) { try { waitForm.SetText(text); } catch (Exception) { } } } } }
1.3 使用WaitFormService提供的接口
try { WaitFormService.CreateWaitForm(); Assembly asmb = Assembly.GetExecutingAssembly(); Object obj = asmb.CreateInstance(className); Form frm = obj as Form; this.ShowMenu(frm); WaitFormService.CloseWaitForm(); } catch (Exception ex) { WaitFormService.CloseWaitForm(); }
参考文章
1. 飘落纸飞机,C# winform 多线程中创建等待窗体,2011。
相关文章
- C#子线程中更新ui-----c# 多线程多文件批量下载
- C#多线程技术提高RabbitMQ消费吞吐率
- C#消息队列(RabbitMQ)零基础从入门到实战演练
- c#常用工具类:文件和二进制转换
- Win10系列:C#应用控件基础5
- C#客户端Redis服务器的分布式缓存
- C#编程总结(四)多线程应用
- c# webapi 自定义返回数据
- [通信] C#多线程Socket-文件传输
- 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
- C# WinForm多线程开发(一) Thread类库
- C# 用Linq实现DataTable实现重复数据过滤
- C# 对Word文档进行处理
- C# - 多线程 之 进程与线程
- C#实现CAD数据转shape或mdb
- C# 多线程参数传递
- C# WinForm多线程开发(三) Control.Invoke
- C# 多线程参数传递
- C# 注册表帮助类
- C# WinForm程序中,使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出。
- C#多线程(一)
- C#命令行编译和执行
- C#线程同步的几种方法
- C#winform-多线程【案例+源码】