C#多线程同步和异步共同使用Demo

2025-04-07 02:12:39
推荐回答(1个)
回答1:

做了个小demo
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Random rdTime = new Random();
        private delegate void ChangeTextBoxCallBack(TextBox control, string text);
        private EventHandler LastRunThreadD;
        private int m_threadOverCount = 0;
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread th = new Thread(ThreadA);
            th.Start();
            //winform其它操作..
        }
        private void ThreadA()
        {
            //A线程要做的事
            //这里模拟做事耗时1s-10s之间
            Thread.Sleep(rdTime.Next(1000, 10000));
            ChangeTextBox(textBox1, "线程A处理完毕");
            //按照题主要求,A线程处理完毕处理B、C
            Thread tB = new Thread(ThreadB);
            Thread tC = new Thread(ThreadC);
            m_threadOverCount = 0;
            LastRunThreadD += ThreadD;
            tB.Start();
            tC.Start();
        }
        private void ThreadB()
        {
            Thread.Sleep(rdTime.Next(1000, 10000));
            m_threadOverCount++;
            ChangeTextBox(textBox1, "线程B处理完毕");
            //处理完毕运行线程D
            if (LastRunThreadD != null)
                LastRunThreadD.Invoke(null, null);
        }
        private void ThreadC()
        {
            Thread.Sleep(rdTime.Next(1000, 10000));
            m_threadOverCount++;
            ChangeTextBox(textBox1, "线程C处理完毕");
            //处理完毕运行线程D
            if (LastRunThreadD != null)
                LastRunThreadD.Invoke(null, null);
        }
        private void ThreadD(object sender, EventArgs e)
        {
            //确定B、C线程都结束了才正式执行
            if (m_threadOverCount == 2)
            {
                Thread.Sleep(rdTime.Next(1000, 10000));
                ChangeTextBox(textBox1, "线程D处理完毕");
            }
        }
        //这里使用Control而不是使用Textbox,是为了做通用委托,更改不同控件不同属性
        //private void ChangeTextBox(Control control, params object[] value);
        private void ChangeTextBox(TextBox control, string text)
        {
            if (control.InvokeRequired)
            {
                ChangeTextBoxCallBack ctbc = new ChangeTextBoxCallBack(ChangeTextBox);
                control.Invoke(ctbc, control, text);
            }
            else
                control.Text += string.IsNullOrEmpty(control.Text) ? text : "\r\n" + text;
        }
    }
}