2012-02-07 10 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.Images.Clear() 
+0

スレッドのコンテキストを把握する必要があります。今は痛みのように思えるかもしれませんが、将来この権利を得るために時間を節約することができます。 –

+0

あなたのコードには1つの問題があります - コントロール/その親の 'Handle'が作成されていない場合' InvokeRequired'は 'false'を返します。あなたのコードを最初に使う前に、UIスレッド上に 'Handle'が作成されていることを確認しなければなりません。さもなければ、あなたのアプリケーションは奇妙な問題に遭遇します! – Yahia

答えて

3

を呼びたい、イメージリストは、InvokeRequiredや呼び出しを持っていない、プラス私はプロパティを設定する必要はありません

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

これは、非同期にUIスレッドでデリゲートを呼び出します。リストを直ちに消去する必要がある場合は、送信と送信を置き換えます。もちろん、消去したいImageListへの参照も必要です。

+0

ありがとうalot ..私はそれを試してみよう –

+0

私はこれまでにそれを見たことがないので、ちょうど好奇心の外ですが、何が? –

+0

このコンテキストでは、インラインデリゲートと考えることができます。 'o'はパラメータであり、メソッドの本体は' ImageList.Images.Clear() 'なので、この場合、パラメータ' o'は使われません。 'o'の型は[型推論](http://en.wikipedia.org/wiki/Type_inference)によって決まります。 –