使用event相当于使用回调函数,回调函数还是在子线程中运行,如果需要在其中执行修改form显示等操作的话肯定是不安全的,会与主线程或其他子线程冲突。象楼上那样只是显示一个messagebox当然没问题。
使用Invoke,delegate函数是在主线程中运行,相当于主线程中发生了一个事件,或收到一个消息,所以没有冲突。如果你的子线程需要等待delegate函数执行完成,并获取其返回值后才能继续执行,当然用Invoke了;否则用BeginInvoke。一般只是给主线程发个通知说明某个状态改变了用BeginInvoke可矣。

解决方案 »

  1.   

    Give you a sample:public class Form1
    {
    // 声明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 });  // 通知主线程
    ...
    }
    }