多线程异步编程(1):创建多个线程执行任务,同时更新进度条,使用WaitHandle发送信号

效果图:

1.创建线程参数类

public class ThreadParam
    {
        public int threadType;
        public ThreadParam(int threadType)
        {
            this.threadType = threadType;
        }
    }

2.创建线程要指派的委托和全局锁对象,完成进度

   delegate void CommonBeginInvoke();

   object sync = new object();//所对象

   double counter = 0;//工作线程完成进度

   AsyncOperation asyncOperation = AsyncOperationManager.CreateOperation(null);  //使用异步操作类传递数据出去

3.创建每个线程要发送的信号

public WaitHandle[] waitHandles = new WaitHandle[]
        {
            new AutoResetEvent(false),
            new AutoResetEvent(false)
        };

4.创建线程,实例化线程传递给委托的参数类,通过判断参数类给不同的线程指定相应的方法

public void CreateThread()
        {
            ThreadParam threadParam = null;
            for (int key = 0; key < 2; key++)
            {
                threadParam = new ThreadParam(key);
                copyFileThread = new Thread(new ParameterizedThreadStart(Operate));//Operate回调方法
                copyFileThread.Name =key.ToString();
                copyFileThread.IsBackground = true;
                copyFileThread.Start(threadParam);//threadParam线程参数
            }
        }

5.回调方法

void Operate(object param)
        {
            if (param is ThreadParam)
            {
                ThreadParam tParams = param as ThreadParam;
                if (tParams != null)
                {           

                   if (tParams.threadType==1)
                    {
                        CompressFileDelegate copyFileBeginInvoke = FunctionA;
                        object[] A= { waitHandles[0], 1 };
                        copyFileBeginInvoke.BeginInvoke(SendSignals, A);
                    }

                    if (tParams.threadType == 2)
                    {
                        CompressFileDelegate copyFileBeginInvoke = FunctionB;
                        object[] B= { waitHandles[0], 2 };
                        copyFileBeginInvoke.BeginInvoke(SendSignals, B);
                    }

                }

            }

       }

6.委托的回调方法,用于发送信号

public void UpdateToolStripProgressBar(IAsyncResult result)
        {
            object[] tmp = result.AsyncState as object[];
            AutoResetEvent autoEvent = tmp[0] as AutoResetEvent;

            lock (sync)
            {
                counter = counter + (100 / 2);

                asyncOperation .Post(from.UpdateToolStripProgressBarValue, counter);
            }
            autoEvent.Set();
        }

7.创建监听线程,用于监听上面的工作线程

public void CreateLintener()
        {
            //用于监听其他线程,其他线程操作完成就修改界面
            Thread thread = new Thread(new ThreadStart(Notify));
            thread.Start();
        }

8.等待线程执行完,通知界面弹出消息框

public void Notify()
        {
            WaitHandle.WaitAll(waitHandles);

            from.BeginInvoke(new UIInvokeDelegate(from.UpdateDataReduce));
        }

9.from就是主界面Form实例的一个引用。注意千万不要在上面的代码中去new  form,否则报出一下异常:

invok和begininvoke在窗口创建前不能被调用

from.UpdateToolStripProgressBarValue和from.UpdateDataReduce:写在form.cs文件里面,第一个用于更新进度条,第二个用于弹出消息框

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值