我有一个我创建的类,在课堂上我做了一些多线程。通常在表单上进行多线程我会使用以下方法...
//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方法......我如何让它工作?
答案 0 :(得分:0)
Invoke
方法复制起来并不那么“容易”(附带问题:为什么不使用BeginInvoke
?我猜你可能不需要同步引发事件)。您可以在Application.OpenForms
中获取第一个表单(在使用前复制!)并检查该表单以检查InvokeRequired
和BeginInvoke/Invoke
。