2010-12-16 42 views
13

在我的應用程序中,我有一個用戶控件使用線程池進行異步操作。 線程池的方法是這樣的:檢測控件是否被處理

private void AsyncFunction(object state) 
    { 
     ... do the calculation 
     //refresh the grid data on the UI thread 
     this.BeginInvoke(new MethodInvoker(() => 
               { 
          ... update the ui 
               })); 
    } 

我的問題是,如果用戶關閉對話框...用戶控制得到處理,我得到異常:

調用或BeginInvoke不能被稱爲在一個控件上,直到窗口句柄被創建。

你知道一種檢測對話框是否被丟棄的方法嗎?我不想在關閉時設置對話框的屬性。 有沒有解決這個問題的另一種方法?

感謝,

拉杜

+0

+1。非常有用的問題。 – Nick 2011-03-28 14:51:27

回答

17
+0

+1:一切都說:) – LaGrandMere 2010-12-16 12:26:43

+0

如果它解決了您的問題,請將此標記或任何其他答案作爲正確答案。 :) – 2010-12-16 13:00:44

+1

其實它並不能解決100%的情況。看到http://stackoverflow.com/questions/4460709/detect-if-control-was-disposed/4460737#4460737低於 – Nick 2011-03-28 14:52:10

6

可以使用Control.IsDisposed屬性。

try 
{ 
    if(!this.IsDisposed) 
    { 
     this.BeginInvoke(new MethodInvoker(() => 

         { 
           // update my control 
         } 
     )); 
    } 
} 
catch (InvalidOperationException) 
{ 
    // Do something meaningful if you need to. 
} 
+0

我不知道我怎麼會錯過。我明確地搜索了它:) – 2010-12-16 12:31:28

+0

您需要在調用'BeginInvoke'之前檢查'IsDisposed',因爲如果控制權被處置,它將失敗。 – max 2010-12-16 12:33:21

+0

好..我錯過了..我編輯了答案..謝謝 – 2010-12-16 12:39:24

0

您可以嘗試使用像EventWaitHandle同步對象發出信號的工作線程,主線程即將終止。然後工作線程可以結束它的執行。