我正在爲我的控件開發UI自動化。下面的代碼在VS2012中工作正常。爲什麼VS2012和VS2013的InvokeRequired屬性值不同?
MyControl.PointToClient(p);
而且我用下面的代碼來調用控制
public new Point PointToClient(Point p)
{
if (MyControl.InvokeRequired)
{
pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
GetWindow().Invoke(ptcb, new object[] { p });
}
return MyControl.PointToClient(p);
}
delegate Point pointToClientCallBack(Point p);
後,我調用了我的控制,InvokeRequired屬性是真實的。
那麼,你能否建議我解決這個問題的正確方法。
感謝,
InvokeRequired是一個相當可疑的屬性,它只是增加了一個線程比賽錯誤代碼。如果你不知道這個代碼運行在哪個線程上,那麼它很難證明它是線程安全的。當此代碼與UI線程忙於創建控制窗口的同時運行時,會發生競爭錯誤。 GetWindow()本身已經是一個非常好的候選人,很難看出你爲什麼這麼做。您必須確保在UI準備就緒之前線程無法啓動。 Load事件是信號。 –
@HansPassant,在GetWindow方法中我返回我的控件。我發現了_VS2012_和_VS2013_之間的一個區別。在_VS2012_中,線程**狀態**在運行中並且** IsBackground **屬性爲false。在_VS2013_背景中的線程狀態和** IsBackground **屬性爲true。你能告訴我如何解決這個問題。謝謝。 –
那麼,當你不知道你的代碼運行的是什麼線程時會發生這種情況。你必須停止假設這是一個由VS引起的問題,以取得進展。使用調試器,調用堆棧窗口對於確定調用來自哪裏很重要。 –