首先,上个多线程的概念。通过单独的线程来执行某个任务,一个多线程程序可以执行多个任务,而且这些线程都是并行执行,同时执行多个线程的能力称为多线程。
根据多线程的概念,我们知道,多线程可以提高程序的运行效率,加快运行的速度。比较典型的应用就是我们经常使用的下载工具,就用到了多线程技术。
在C#里面,.net framework为我们提供了多线程的实现。微软的msdn文档,也给出了实例。见MSDN Thread类说明
下面上一段代码,看一下C#中如何实现多线程。
我们在控制台项目中,键入如下代码:
Main函数中定义了3个线程的线程数组,然后循环调用。
static void Main(string[] args)
{
TestThread testThread = new TestThread();
Thread[] test = new Thread[]
{
new Thread(new ThreadStart(testThread.ActionMethod)),
new Thread(new ThreadStart(testThread.ActionMethod)),
new Thread(new ThreadStart(testThread.ActionMethod))
};
for (int i = 0; i < test.Length; i++)
{
test[i].Name = "子线程" + i;
test[i].Start();
}
}
这是一个普通的方法,用于测试线程的执行情况。
public class TestThread
{
public void ActionMethod()
{
//lock (this)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("线程名:" + Thread.CurrentThread.Name);
}
}
}
}
我们发现在ActionMethod方法中,lock(this)这一行被注释掉了。
我们看一下运行状况。
这是没加lock(this)的运行情况 这是加了lock(this)的运行情况
很显然,lock将每一个线程对象锁住,直到该对象释放为止。我们看看官方的解释:lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。见msdn lock
这就引出了一个线程同步的概念。也就是说,我们在程序中想办法,对多个线程的执行进行协调,使线程按照顺序来执行。线程同步的意思并不是说多个线程保持同样的次序输出,而是说单独的线程执行不被其他线程所干扰,要执行下一个线程必须等待该线程结束才能进行。这样才能保证多个线程输出的一致和同步。
说到这里,我想有人想问,多个线程同时执行,我怎么去对他们执行的优先级进行控制呢?比如,我想让线程1的活先干完,然后让线程2的活干完,最后是线程3的活干完。
这是很自然的需求,C#很方便的进行了实现。
还是利用上面的代码,在线程执行之前,我们加下面这3行代码。
test[0].Priority = ThreadPriority.Highest;//优先级最高
test[1].Priority = ThreadPriority.Lowest;//优先级最低
test[2].Priority = ThreadPriority.Normal;//优先级正常
关于优先级枚举,可参见msdn ThreadPriority
最后,我们将做一个累加器,用多线程来实现。
首先我们画一个winform界面
然后我们再开始计算按钮下面输入如下代码(这里的控件名没改,读者自行修改):
this.textBox4.Text = "0";
listBox1.Items.Clear();
int threadNumber = Convert.ToInt32(this.textBox3.Text);
for (int i = 1; i <= threadNumber; i++)
{
ThreadStart threadStart = new ThreadStart(Add);
Thread thread = new Thread(threadStart);
thread.Name = i.ToString();
thread.Start();
}
private void Add()
{
DateTime beginTime = DateTime.Now;
long minValue = long.Parse(textBox1.Text);
long maxValue = long.Parse(textBox2.Text);
int threadNumber = Convert.ToInt32(textBox3.Text);
int threadOrder = Convert.ToInt32(Thread.CurrentThread.Name);
long step = (maxValue - minValue + 1) / threadNumber;
long beginValue = minValue + step * (threadOrder - 1);
long endValue = beginValue + step;
long result = 0;
for (long i = beginValue; i < endValue; i++)
{
result += i;
}
lock (this)
{
long sum = long.Parse(textBox4.Text);
sum += result;
textBox4.Text = sum.ToString();
}
DateTime endTime = DateTime.Now;
TimeSpan timeSpan = endTime - beginTime;
string message = "线程" + Thread.CurrentThread.Name + ":" + beginValue.ToString() + "到" + endValue.ToString() + ", 耗时:" + timeSpan.TotalMilliseconds.ToString() + "毫秒";
this.listBox1.Items.Add(message);
Thread.CurrentThread.Abort();
}
Add方法是一个核心方法,将需要计算的范围按照线程数进行分割,这样让每个线程独自的完成自己的任务,而不是一个线程从头跑到尾。OK,我们查看一下运行效果图:
这里可以看到每个线程的运行情况和执行情况。
分享到:
相关推荐
C#多线程实现定时器
使用多线程技术,获取网页内容,可以自行修改。
一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用...
C#多线程实现了简单的任务管理器的功能; 是初学多线程同学的一个很好的例子,有助于进一步了解多线程;
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
程序处理比较耗时的操作时,界面经常卡住,给用户一种停止运行的错觉。给出一个等待窗体,能够增加程序的友好性,但是由于主程序在忙于处理数据,所以弹出的窗体最好用另外一个新的线程,来负责显示这个等待窗体。
C#中实现backgroundwoker控件多线程的具体操作。
通过多线程的方式实现了UDP收发数据 可以快速学习UDP通讯原理应进行实际应用
这是一个C#学习与参考代码,希望对正在学习C#的朋友有所帮助!
c#编写串口通讯代码多线程实现,逻辑与界面分离。发送与接收都为单独线程
c#初学的课堂作业线程的使用,大炮打飞机,简单的实现线程的使用。
在琢磨如何更好的剖析一个项目源码,先从小项目下手
C#多线程互斥实例 多线程获取同一变量(不重复)。是一个很好的学习例子
详细讲解了多线程的四种实现方式(Thread、线程池、Task、委托),以及各种实现方式的优缺点。相信对于想学习多线程的朋友是个不错的选择。
此程序实现了根据路径搜索路径之下包括子目录中的所有文件中你所想要找的文件。 用checklistbox控件实现了选择多种文件的扩展名, 以扩展名为条件在指定的目录下搜索, 并把显示的结果用ListView显示出来, 若是图片...
c#使用多线程动态在多张图上画图和写字,实现点击开始后三张图片开始画图,并且鼠标放在图片上时图片放大。
用c#实现的 多线程小例子 不带参数/带参数的多线程函数示例
基于winForm实现的C#多线程大炮打飞机实验.zip基于winForm实现的C#多线程大炮打飞机实验.zip基于winForm实现的C#多线程大炮打飞机实验.zip基于winForm实现的C#多线程大炮打飞机实验.zip基于winForm实现的C#多线程...
C#实现多线程下载文件,结合多线程技术的各方面知识,是比较好的学习例子。
包含9个不同的进度条源码,C#多线程、进度条、C#多线程进度条、progressBar、实例源码、C#.NET winform 利用多线程技术,值得参考和学习!