2012-06-29 675 views
1

嗨,IsHandledCreated設置爲false,但在運行時將其設置爲true?

我有一個Application.Exit期間拼命地跑下面的代碼:

  if (InvokeRequired && this.IsHandleCreated) 
      { 
       this.Invoke(new Action(() => EndUpdate(Caller))); 
       return; 
      } 

這引發異常:調用或BeginInvoke不能上一個控件調用,直到窗口句柄有已創建但僅在應用程序出現時。

奇怪的部分是,當調試器打破了錯誤,我可以看到,InvokeRequired和IsHandledCreated都設置爲false,所以即時通訊不知道它如何設法得到內部代碼(this.Invoke)?

在這種情況下,我只想關閉應用程序,沒有任何例外。

+0

在if語句上放置一個斷點並查看錯誤之前的值。 – saj

+0

@saj>我從來沒有聽說過如果出現錯誤,所以我認爲當它檢查InvokeRequired和IsHandleCreated時它會變爲True/True,但是另一個線程在Invoke運行之前更改此權限。 Maby我可以在Invoke方法中實現對IsHandleCreated的檢查,但它可能會導致同樣的問題。 – Banshee

回答

0

檢查那種方式不是線程安全的條件。 首先,當線程在如果運營商和呼叫調用之間切換時,您可以點擊競爭條件。在其他情況下,我會建議你在這裏進行一些同步,但不可能進入框架代碼。

另外,調用將查詢放入UI消息隊列,然後UI線程從隊列中提取它並執行。同時,調用等待直到UI線程完成執行此查詢使用Form.Handle。 因此,請確保您沒有撥打電話Form.Close()裏面EndUpdate方法,這可能會導致在等待時發生異常。

我建議你把EndUpdate()調用內部Form.OnClosing()重寫。這將是線程安全的,並且句柄保證存在。

相關問題