C#多线程的实现

简介: 首先,上个多线程的概念。通过单独的线程来执行某个任务,一个多线程程序可以执行多个任务,而且这些线程都是并行执行,同时执行多个线程的能力称为多线程。

首先,上个多线程的概念。通过单独的线程来执行某个任务,一个多线程程序可以执行多个任务,而且这些线程都是并行执行,同时执行多个线程的能力称为多线程。

根据多线程的概念,我们知道,多线程可以提高程序的运行效率,加快运行的速度。比较典型的应用就是我们经常使用的下载工具,就用到了多线程技术。

在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,我们查看一下运行效果图:



这里可以看到每个线程的运行情况和执行情况。

目录
相关文章
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
178 3
|
4月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
4月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
29天前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
2天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
12 0
|
1月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
28 0
|
3月前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
3月前
|
大数据 C#
C#实现多线程的几种方式
C#实现多线程的几种方式
|
4月前
|
安全 Java C#
C#多线程详解
C#多线程详解
41 0