使用InvokeRequired属性和Invoke方法创建具有线程安全函数的类

时间:2012-03-14 23:33:14

标签: c# multithreading invoke

我有一个我创建的类,在课堂上我做了一些多线程。通常在表单上进行多线程我会使用以下方法...

//Thread Safe Functions
delegate void Thread_Safe_SendMessage_Progress_Callback(string sProgress);
private void Thread_Safe_SendMessage_Progress(string sProgress)
{
    if (this.InvokeRequired)
    {
        Thread_Safe_SendMessage_Progress_Callback d =
            new Thread_Safe_SendMessage_Progress_Callback(Thread_Safe_SendMessage_Progress);
        try
        {
            this.Invoke(d, new object[] { sProgress });
        }
        catch
        {
            //ObjectDisposedException
        }
    }
    else
    {
        //Fire up the thread event
        SendMessageThread_Progress(sProgress);
    }
}

现在完美无缺!此时我尝试将多线程引入我制作的类中。当我这样做时,除了InvokeRequired属性和我的类中不存在Invoke方法之外,一切看起来都很棒。所以使用this.InvokeRequired会抛出一个错误...为了给我的类属性我这样做...(注意m_iThreadID是在构造函数中设置的,当创建线程时开始)

private bool InvokeRequired
{
    get
    {
        //Get the current thread id
        int iThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;

        //Compare and return results
        return (iThreadID != m_iThreadID);
    }
}

现在唯一剩下的就是Invoke方法......我如何让它工作?

1 个答案:

答案 0 :(得分:0)

Invoke方法复制起来并不那么“容易”(附带问题:为什么不使用BeginInvoke?我猜你可能不需要同步引发事件)。您可以在Application.OpenForms中获取第一个表单(在使用前复制!)并检查该表单以检查InvokeRequiredBeginInvoke/Invoke