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()等方法处于封锁状态
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#来说多线程很简单的,只要不涉及到线程同步,还是比较容易理解的,只需要声明一个thread类,封装一下入口函数,然后启用就可以了。网上这样的多线程处理例子多得是。只需要用百度搜索 C# 多线程 大把大把的例子供你参考
filePathArray是保存有所有文件地址的数组,ParameterizedThreadStart委托可以让线程接受一个object类型的参数,然后传递给线程的工作函数。在这里我猜大概你只需要文件地址,所以直接用了string。如果你需要更多的数据,就需要自定义一个类来将这些数据封装,然后将这个类传递给工作函数 private void Thd(string[] filePathArray) { foreach (string filePath in filePathArray) { Thread t = new Thread(new ParameterizedThreadStart(Work)); t.Start(filePath); } } private void Work(object para) { string filePath = para as string; if (filePath != null || para != "") { //做你自己的处理代码 } }