C# WinForm多线程开发(一) Thread类库
2023-09-14 09:03:14 时间
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又
线程入口使程序知道该让这个线程干什么事,在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用 Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。 ThreadState在各种情况下的可能取值如下:
Aborted:线程已停止 AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止 Background:线程在后台执行,与属性Thread.IsBackground有关 Running:线程正在正常运行 Stopped:线程已经被停止 StopRequested:线程正在被要求停止 Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行) SuspendRequested:线程正在要求被挂起,但是未来得及响应 Unstarted:未调用Thread.Start()开始线程的运行 WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态 二 Winform中使用的thread 首先可以看看最直接的方法,也是.net 1.0下支持的方法。但请注意的是,此方法在.net 2.0以后就已经是一种错误的方法了。
原文地址:点击打开链接
[摘要]本文介绍C#
WinForm多线程开发之Thread类库,并提供简单的示例代码供参考。
线程入口使程序知道该让这个线程干什么事,在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用 Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。 ThreadState在各种情况下的可能取值如下:
Aborted:线程已停止 AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止 Background:线程在后台执行,与属性Thread.IsBackground有关 Running:线程正在正常运行 Stopped:线程已经被停止 StopRequested:线程正在被要求停止 Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行) SuspendRequested:线程正在要求被挂起,但是未来得及响应 Unstarted:未调用Thread.Start()开始线程的运行 WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态 二 Winform中使用的thread 首先可以看看最直接的方法,也是.net 1.0下支持的方法。但请注意的是,此方法在.net 2.0以后就已经是一种错误的方法了。
public partial class Form1 : Form public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) Thread thread = new Thread(ThreadFuntion); thread.IsBackground = true; thread.Start(); private void ThreadFuntion() while (true) this.textBox1.Text = DateTime.Now.ToString(); Thread.Sleep(1000); }这段code 在vs2005或者2008上都抛出异常 :Cross-thread operation not valid:Control textBox1 accessed from a thread other than the thread it was created on . 这是因为.net 2.0以后加强了安全机制,不允许在winform中直接跨线程访问控件的属性。那么怎么解决这个问题呢,下面提供几种方案。 第一种方案: 在Thread创建之气,将Control.CheckForIllegalCrossThreadCalls 设为 false。 此代码告诉编译器:在这个类中我们不检查跨线程的调用是否合法(如果没有加这句话运行也没有异常,那么说明系统以及默认的采用了不检查的方式)。然而,这种方法不可取。我们查看CheckForIllegalCrossThreadCalls 这个属性的定义,就会发现它是一个static的,也就是说无论我们在项目的什么地方修改了这个值,他就会在全局起作用。而且像这种跨线程访问是否存在异常,我们通常都会去检查。如果项目中其他人修改了这个属性,那么我们的方案就失败了,我们要采取另外的方案。 第二种方案
namespace TestInvoker public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) Thread thread = new Thread(new ThreadStart(StartSomeWorkFromUIThread)); thread.IsBackground = true; thread.Start(); //StartSomeWorkFromUIThread(); //label1.Text = "Set value through another thread!"; private void StartSomeWorkFromUIThread() if (this.InvokeRequired) BeginInvoke(new EventHandler(RunsOnWorkerThread), null); else RunsOnWorkerThread(this, null); private void RunsOnWorkerThread(object sender, EventArgs e) Thread.Sleep(2000); label1.Text = System.DateTime.Now.ToString(); }通过上叙代码,可以看到问题已经被解决了,通过等待异步,我们就不会总是持有主线程的控制,这样就可以在不发生跨线程调用异常的情况下完成多线程对winform多线程控件的控制了。
相关文章
- c html美化winform,C# WinForm界面美化
- C#的WinForm窗体程序中如何设置TextBox为密码文本框
- c#数组赋初值_C#数组初始化
- winform与php交互,WinForm与Javascript交互「建议收藏」
- C#多线程编程_wpf和winform的区别
- C# 中类与继承等概念
- 【地铁上的Redis与C#】数据类型(五)--Hash类型
- MD5加密(java和c#)详解程序员
- 传智播客C#面向对象17课时
- .NET 生态现状:超一半 .NET 开发者使用 C# 8、.NET Framework 使用量减少
- C#Winform实现屏蔽键盘的win和alt+F4的实现代码
- c#循环中产生伪随机数
- 用C#Winform做出全透明的磨砂玻璃窗体效果代码
- c#解决IIS写Excel的权限问题
- c#winform关闭窗体时同时结束线程实现思路
- c#winform多线程的小例子
- 浅析c#中WebBrowser控件的使用方法
- c#winform读取xml文件创建菜单的代码
- C#正则表达式分解和转换IP地址实例(C#正则表达式大全c#正则表达式语法)
- 浅析C#中的Main(String[]args)参数输入问题
- c#使用热键实现程序窗口隐藏示例
- C#控制IE进程关闭和缓存清理的实现代码
- C#WinForm实现Win7Aero透明效果代码
- C#采用Winform实现类似Android的Listener