c#多线程同步执行

对于多线程同步执行,可能听起来比较拗口,但是它的作用在某些业务下,有非常的大作用,分别进行阐述。

同步

同步就是按照顺序1234这样进行下去,有顺序,有规律的进行着。

多线程

多线程对于单线程来说的,单线程,就是开启一个线程进行工作,多线程则是,开启多个线程进行多个工作,并且没有顺序,没有规律性。

多线程同步,则是,既有同步和多线程的特点,即开启多个线程进行工作的同时,还要按照顺序和规律执行。

其实,解决多线性同步的问题,有很多种,比如使用lock锁等等方法。本节介绍使用async/await的方法来实现他的功能。

1.建立一个winform程序,可以模拟界面处理数据

2.使用同步的方法

对变量a增加1,其中 Thread.Sleep(1000)可以表示,这个业务处理的时间,然后连续增加5次。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        int a = 0;
        public Form1()
        {
            InitializeComponent();
        }
        private  void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            A();
            //Task.Delay(3000);
            //B();
            //Task.Delay(3000);
            //await  C();
            stopwatch.Stop();
            label1.Text = a.ToString();
            label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;

            //Thread.Sleep(10000);
        }
        /// <summary>
        /// 单线程,同步有顺序
        /// </summary>
        public void A()
        {
            a++;
            Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);
        }
        /// <summary>
        /// 多线程,并行,没有顺序
        /// </summary>
        public void B()
        {

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });


            //List<Task> tasks = new List<Task>();


            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //Task.WaitAll(tasks.ToArray());
        }

        /// <summary>
        /// 多线程,并行,有顺序
        /// </summary>
        /// <returns></returns>
        public async Task C()
        {
            Task task = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task;
            Task task1 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task1;

            Task task2 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task2;

            Task task3 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task3;

            Task task4 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task4;
        }


    }
}

效果

耗时5036,按照顺序执行,并且界面是卡死状态。

3.使用多线程的方法

因为变化太快了,所以增加了延迟

多线程,还可以使用B()中屏蔽的方法

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        int a = 0;
        public Form1()
        {
            InitializeComponent();
        }
        private  void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //A();
            Task.Delay(3000);
            B();
            Task.Delay(3000);
            //await  C();
            stopwatch.Stop();
            label1.Text = a.ToString();
            label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;

            //Thread.Sleep(10000);
        }
        /// <summary>
        /// 单线程,同步有顺序
        /// </summary>
        public void A()
        {
            a++;
            Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);
        }
        /// <summary>
        /// 多线程,并行,没有顺序
        /// </summary>
        public void B()
        {
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });


            //List<Task> tasks = new List<Task>();


            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //Task.WaitAll(tasks.ToArray());
        }

        /// <summary>
        /// 多线程,并行,有顺序
        /// </summary>
        /// <returns></returns>
        public async Task C()
        {
            Task task = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task;
            Task task1 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task1;

            Task task2 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task2;

            Task task3 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task3;

            Task task4 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task4;
        }


    }
}

效果 

耗时29,可以看到没有按照顺序进行,但是界面是可以移动的

4. 多线程同步

这段代码就阐述了,即开启多个线程进行工作的同时,还按照顺序和规律执行。

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        int a = 0;
        public Form1()
        {
            InitializeComponent();
        }
        private async void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //A();
            //Task.Delay(3000);
            //B();
            //Task.Delay(3000);
            await  C();
            stopwatch.Stop();
            label1.Text = a.ToString();
            label2.Text = "耗时:" + stopwatch.ElapsedMilliseconds;

            //Thread.Sleep(10000);
        }
        /// <summary>
        /// 单线程,同步有顺序
        /// </summary>
        public void A()
        {
            a++;
            Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);

            a++; Console.WriteLine(a);
            Thread.Sleep(1000);
        }
        /// <summary>
        /// 多线程,并行,没有顺序
        /// </summary>
        public void B()
        {
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });

            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });
            Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(10000);
            });


            //List<Task> tasks = new List<Task>();


            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //tasks.Add(Task.Run(() =>
            //{
            //    a++;
            //    Console.WriteLine(a);
            //    Thread.Sleep(1000);
            //}));

            //Task.WaitAll(tasks.ToArray());
        }

        /// <summary>
        /// 多线程,并行,有顺序
        /// </summary>
        /// <returns></returns>
        public async Task C()
        {
            Task task = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task;
            Task task1 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task1;

            Task task2 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task2;

            Task task3 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task3;

            Task task4 = Task.Run(() =>
            {
                a++;
                Console.WriteLine(a);
                Thread.Sleep(1000);
            });
            await task4;
        }


    }
}

 效果

耗时5052,并且是按照顺序执行的,而且界面还可以拖动,正是我们需要的。 

拓展async/await

在C()方法中,其实是遇到await后,代码则是返回task.run上面去了,然后从上到下再执行,执行到第二方法,又返回task.run上面去了,然后再从上到下执行,以此类推,所以和同步执行的时间基本上一样的。

来源:c#多线程同步执行_c# 如何实现一个同步执行多个方法的方法_故里2130的博客-CSDN博客

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值