2012-02-07 4 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은, 그냥

ImageList.Images.Clear() 
+0

스레드 컨텍스트를 추적해야합니다. 그것은 지금 고통처럼 보일지도 모르지만, 당신은이 권리를 얻기 위해 미래에 시간을 절약 할 것입니다. –

+0

당신의 코드는 한가지 문제가 있습니다 - 컨트롤/부모의'Handle '이 생성되지 않았다면'InvokeRequired'는'false'를 리턴 할 것입니다. 코드를 처음 사용하기 전에 UI 스레드에서'Handle'이 생성되었는지 확인해야합니다. 그렇지 않으면 응용 프로그램이 이상한 문제를 일으킬 것입니다! – Yahia

답변

3

당신이 할 수있는 전화하고 싶은 InvokeRequired이 있거나 호출, 플러스 내가 속성을 설정하지 않으하지 않습니다

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

이것은 비동기 적으로 UI 스레드에서 대리인을 호출합니다. 목록을 즉시 지우려면 보내기와 함께 바꾸십시오. 물론 지우려는 ImageList에 대한 참조가 필요합니다.

+0

고마워요. 어쩌면 시도해 보겠습니다. –

+0

전에는 본 적이 없기 때문에 호기심에서 벗어났습니다. 그러나 => 어떻게합니까? –

+0

이 컨텍스트에서는 인라인 대리자로 생각할 수 있습니다. 'o'가 매개 변수이고 메서드 본문이'ImageList.Images.Clear()'이므로이 경우 매개 변수'o'는 사용되지 않습니다. 'o'의 타입은 [타입 추론] (http://en.wikipedia.org/wiki/Type_inference)에 의해 결정됩니다. –