资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

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)的运行情况

C# 多线程的实现C# 多线程的实现

很显然,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界面

C# 多线程的实现

然后我们再开始计算按钮下面输入如下代码(这里的控件名没改,读者自行修改):

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# 多线程的实现
这里可以看到每个线程的运行情况和执行情况。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


当前文章:C#多线程的实现-创新互联
新闻来源:http://cdkjz.cn/article/dcsjgg.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220