使用event相当于使用回调函数,回调函数还是在子线程中运行,如果需要在其中执行修改form显示等操作的话肯定是不安全的,会与主线程或其他子线程冲突。象楼上那样只是显示一个messagebox当然没问题。
使用Invoke,delegate函数是在主线程中运行,相当于主线程中发生了一个事件,或收到一个消息,所以没有冲突。如果你的子线程需要等待delegate函数执行完成,并获取其返回值后才能继续执行,当然用Invoke了;否则用BeginInvoke。一般只是给主线程发个通知说明某个状态改变了用BeginInvoke可矣。
使用Invoke,delegate函数是在主线程中运行,相当于主线程中发生了一个事件,或收到一个消息,所以没有冲突。如果你的子线程需要等待delegate函数执行完成,并获取其返回值后才能继续执行,当然用Invoke了;否则用BeginInvoke。一般只是给主线程发个通知说明某个状态改变了用BeginInvoke可矣。
{
// 声明delegate
private delegate void AsyncTaskDelegate(int taskID, object[] parms);
private AsyncTaskDelegate m_delegateTask; public Form1()
{
// 创建deletgate
m_delegateTask = new AsyncTaskDelegate(AsyncTaskMethod); // 创建子线程
Thread t = new Thread(new ThreadStart(ThreadMethod));
} // 该函数供子线程调用
public void InvokeTask(int taskID, object[] parms)
{
this.BeginInvoke(m_delegateTask, new object[] { taskID, parms });
} // 该函数是delegate代表的函数,将会在主线程中被执行
private void AsyncTaskMethod(int taskID, object[] parms)
{
switch (taskID)
{
case 0:
...
break;
case 1:
if (parms.GetLength(0) >= 2)
...
break;
...
}
} // 子线程
private void ThreadMethod()
{
...
InvokeTask(0, null); // 通知主线程
...
int param1 = 0;
string param2 = "abc";
InvokeTask(1, new object[2] { param1, param2 }); // 通知主线程
...
}
}