Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
一 关于Thread的说明
在.net framework class library中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。其中提供Thread类用于创建线程,ThreadPool类用于管理线程池等等,此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。如果你想在你的应用程序中使用多线程,就必须包含这个类。Thread类有几个至关重要的方法,描述如下:
Start():启动线程
Sleep(int):静态方法,暂停当前线程指定的毫秒数
Abort():通常使用该方法来终止一个线程
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复。
Resume():恢复被Suspend()方法挂起的线程的执行
线程入口使程序知道该让这个线程干什么事,在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以后就已经是一种错误的方法了
Code
这段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# Winform多线程下载的实现涉及到多线程编程、Winform UI交互以及HTTP文件下载,这些是开发高效桌面应用程序必备的基础技能。通过这样的实践,开发者能够提升处理并发任务的能力,优化用户体验,尤其是在...
通过这个C# WinForm多线程模板示例,开发者可以学习到如何优雅地处理后台任务,保持UI响应,并理解多线程编程中的核心概念。同时,了解如何利用线程同步机制以及异步编程模型,能够更好地优化应用程序的性能和用户...
本资源提供了"C# WinForm多线程防止界面假死"的源码示例,帮助初学者理解和实践如何在WinForm应用中正确使用多线程。 首先,理解WinForm中的主线程与工作线程的区别至关重要。主线程是负责更新和绘制UI的线程,而...
C# winform 多线程 让子线程也能操作界面的方法 源代码
WinForm C# 多线程编程并更新界面(UI) 在 Windows 窗体应用程序中,多线程编程是非常重要的,这样可以提高应用程序的响应速度和用户体验。下面我们来讨论如何在 WinForm 中使用 C# 实现多线程编程并更新界面(UI...
这里我们将详细探讨如何实现“简单C# WinForm多线程委托调用进度条”。 首先,我们需要理解多线程的概念。在C#中,`System.Threading`命名空间提供了对线程的支持。主线程是应用程序的主要执行流,而额外创建的线程...
在C# WinForm应用开发中,我们经常遇到需要在后台执行耗时操作,同时保持用户界面(UI)的响应性。这就是异步编程的核心应用场景。VS2013支持.net框架4.0,该版本引入了Task类和异步编程模型,使得处理这种需求变得...
4. **WinForm多线程处理数据** 在WinForm应用中,后台线程不能直接修改UI元素,因为这可能导致线程冲突。为了解决这个问题,可以使用`Control.Invoke`或`Control.BeginInvoke`方法在UI线程上安全地执行操作。`...
在C#编程中,开发Windows桌面应用程序时,我们经常遇到多线程操作,尤其是在WinForms应用中。当后台线程需要更新用户界面(UI)时,由于.NET Framework的安全机制,直接操作UI控件会引发“Cross-thread operation ...
本项目“C# Winform动态创建和关闭多线程源码 可运行”提供了一个完整的解决方案,适用于Visual Studio 2010,它演示了如何在Winform应用中灵活地创建和管理多个线程。 一、线程基础 线程是操作系统分配CPU时间的...
本文将深入探讨如何在Winform应用中使用异步多线程和线程池。 一、线程基础 线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,可以使用`System.Threading.Thread`类来创建和管理线程。通过...
在C# Winform开发中,多线程技术是不可或缺的一部分,尤其当涉及到用户界面(UI)的异步操作时。线程允许程序同时执行多个任务,提高应用的响应性和效率。本话题将深入探讨如何利用线程来延迟创建子窗体,并且如何安全...
本文将深入探讨如何在C# WinForm中利用多线程实现界面快速刷新。 首先,我们需要理解Windows Forms(WinForm)应用程序的基础架构。默认情况下,WinForm应用程序有一个主线程,负责处理所有UI事件,如用户交互和...
《C# WinForm多线程实现:以QQ程序为例》 在编程领域,尤其是在桌面应用开发中,C# WinForm是一种常见的开发环境,它提供了丰富的界面设计工具和强大的功能支持。而多线程技术则是现代应用程序中不可或缺的一部分,...
在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序正在执行任务,并且不允许用户进行其他操作,直到任务完成。描述提到了“非托管资源”和...
vs2012写的,c# winform程序. 运用线程池写的,查找文件winform, 多线程查找文件. 可以查看当前硬盘有哪些文件,每个文件对应的文件大小.文件路径. 运用listView显示结果.listView分开显示结果信息
在C# WinForm开发中,多线程是一个关键的概念,特别是在构建高性能和响应迅速的应用程序时。Windows操作系统是一个多任务环境,能够同时处理多个进程,每个进程又包含多个线程。线程是程序中的执行单元,拥有自己的...
在C# WinForm应用中,多线程是一个关键的概念,尤其在处理耗时操作或提高应用程序响应性时显得尤为重要。本实例将详细讲解如何在WinForm应用中运用多线程,以及如何处理线程间的数据交互。 首先,理解多线程的基本...