效果图:
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文件里面,第一个用于更新进度条,第二个用于弹出消息框