2012-02-07 25 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