2016-11-10 66 views
0

我正在爲我的控件開發UI自動化。下面的代碼在VS2012中工作正常。爲什麼VS2012和VS2013的InvokeRequired屬性值不同?

MyControl.PointToClient(p); 

但是這段代碼在VS2013中不起作用。這是拋出以下異常 enter image description here

而且我用下面的代碼來調用控制

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屬性是真實的。

那麼,你能否建議我解決這個問題的正確方法。

感謝,

+0

InvokeRequired是一個相當可疑的屬性,它只是增加了一個線程比賽錯誤代碼。如果你不知道這個代碼運行在哪個線程上,那麼它很難證明它是線程安全的。當此代碼與UI線程忙於創建控制窗口的同時運行時,會發生競爭錯誤。 GetWindow()本身已經是一個非常好的候選人,很難看出你爲什麼這麼做。您必須確保在UI準備就緒之前線程無法啓動。 Load事件是信號。 –

+0

@HansPassant,在GetWindow方法中我返回我的控件。我發現了_VS2012_和_VS2013_之間的一個區別。在_VS2012_中,線程**狀態**在運行中並且** IsBackground **屬性爲false。在_VS2013_背景中的線程狀態和** IsBackground **屬性爲true。你能告訴我如何解決這個問題。謝謝。 –

+0

那麼,當你不知道你的代碼運行的是什麼線程時會發生這種情況。你必須停止假設這是一個由VS引起的問題,以取得進展。使用調試器,調用堆棧窗口對於確定調用來自哪裏很重要。 –

回答

1

VS2012和VS2013之間的差異?

我不知道這件事,但我知道你這樣做之後它調用從輔助線程return MyControl.PointToClient(p);returnInvoke

變化:

public new Point PointToClient(Point p) 
{ 
    if (MyControl.InvokeRequired) 
    { 
     pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient); 
     GetWindow().Invoke(ptcb, new object[] { p }); 
    } 
    return MyControl.PointToClient(p); 
} 

...到:

public new Point PointToClient(Point p) 
{ 
    if (MyControl.InvokeRequired) 
    { 
     pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient); 
     return GetWindow().Invoke(ptcb, new object[] { p }) as Point; 
    } 
    return MyControl.PointToClient(p); 
} 

請注意,我們需要將對象轉換從Invoke回到Point以配合您的方法簽名。

此外,您可能應該使用BeginInvoke而不是Invoke,因爲後者可能導致死鎖

+0

如果我使用return語句,我需要使用PointToClient方法計算控制點。如果我嘗試沒有InvokeRequired值爲false。它會拋出一個異常。 –

+0

@MOHANRAJG我不是這麼說的 - 「沒有InvokeRequired」_。感謝您的回覆,您不應該在上述建議 – MickyD

+0

以上得到例外。 方法返回類型是point,所以需要返回點(pt)來計算窗口座標。 但它不計算實際點,直到InvokeRequired爲「True」。 因此,在我的情況下,其他部分需要返回實際值。 **注:** 那是這方面的任何具體的原因在工作精細VS2012,而不是在VS2013我使執行如下命令, 「雖然(MyControl.InvokeRequired) {// 如果部分重複 } return MyControl.PointToClient(p);' 伯爾我不知道什麼是主要原因。 –

相關問題