2012-02-07 63 views
0

如何從另一個線程調用ImageList.Images.Clear()?我試圖做一個函數喜歡如何從另一個線程調用ImageList.Images.Clear()?

private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue); 

    public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue) 
    { 
     if (control.InvokeRequired) 
     { 
      control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue }); 
     } 
     else 
     { 
      control.GetType().InvokeMember(propertyName, System.Reflection.BindingFlags.SetProperty, null, control, new object[] { propertyValue }); 
     } 
    } 

但ImageList中沒有一個InvokeRequired或調用,再加上我不想設置屬性,我只是想打電話

ImageList.Images.Clear() 
+0

你需要跟蹤你的線程上下文。現在看起來可能很痛苦,但是爲了讓這個方案正確無誤,你可以節省自己的時間。 – 2012-02-07 21:26:28

+0

你的代碼有一個問題 - 如果控件/它的父類的'Handle'沒有被創建,那麼'InvokeRequired'將返回'false'。在第一次使用代碼之前,您必須確保已在UI線程上創建了「Handle」,否則您的應用程序將遇到奇怪的麻煩! – Yahia 2012-02-07 21:28:41

回答

3

你可以使用這個:

System.Threading.SynchronizationContext.Current.Post(o => ImageList.Images.Clear(), null); 

這將異步調用UI線程上的委託。如果您需要立即清除列表,請用發送替換郵政。當然你也需要對你想清除的ImageList的引用。

+0

非常感謝..我會嘗試 – 2012-02-07 21:50:10

+0

只是出於好奇,因爲我從來沒有見過它,但是=>做什麼? – 2012-02-07 21:55:57

+0

在這種情況下,您可以將其視爲一個內聯代表。 'o'是參數,方法的主體是'ImageList.Images.Clear()',所以在這種情況下,不使用參數'o'。 「o」的類型由[類型推斷](http://en.wikipedia.org/wiki/Type_inference)確定。 – 2012-02-07 22:02:50