以下的form是其他线程创建的模态窗体(Form.ShowDialog()),在Form内部存在与主线程交叉引用的逻辑,某一时刻用查找到的form控件Invoke调用委托时导致了主线程阻塞,主线程阻塞又导致了form内部交叉引用主线程部分逻辑阻塞,从而互锁住成为了死线程一直阻塞不动了。
Form form =MyAPI.GetForm<Form>(Form.Name);
if (form != null)
{
double temp=99;
//注意:防止子线程和主线程交叉引用后的阻塞问题
方案1:// Task.Factory.StartNew(() => {//加入子线程来执行这块逻辑,如能通过则下面的猜想是对的,经验证与所述一致。(所以可以用多线程或BeginInvoke解决此阻塞问题)
info.Invoke(new Action(() =>
方案2: // info.BeginInvoke(new Action(() =>//此处阻塞原因是因为info的子线程和主线程在其他地方交叉使用了,此处造成了子线程阻塞,导致此处的主线程也阻塞了,而恰好其他地方又使用了主线程,陷入了死循环。
{
MyAPI.SendMessage(form.Handle, MESSAGEID, IntPtr.Zero, temp.ToString());
// form.CustomValue=temp;
}));
});
}