2011-10-21 10 views
2

私はサービスと呼ばれる静的なクラスを持っています。これは新しいスレッドを開始し、他のプロセスからのメッセージを待ち続けます。このクラスでは、メッセージを受信したときに呼び出される必要がある代理人のリストを管理します。これらのデリゲートのメソッドのいくつかは、メインスレッドで実行する必要があります。C#静的クラスからデリゲートを呼び出す

私は何らかの形で脅威を作成した場合は、例えば、私はちょうど

this.Invoke(@delegate, new object[] { messageReceived }); 

を行うことができます。しかし、私は静的クラスにいるので、私はそれを行うことはできません。 (それは私の作成した脅威からではなく、主なものから実行される)

@delegate.Invoke(messageReceived); 

しかし、それはメソッドが実行されるサブプロセスを変更しないので、それは動作しません。だから私はこのようにやってみました。

どうすればいいですか?

ありがとうございます!

+0

BeginInvoke、Invokeではありません。 –

答えて

2

staticクラスを変更してパラメータを受け入れます。

staticクラスに変数としてthis変数を渡します。

0

なぜSystem.Threading.SynchronizationContextクラスを使用しないのですか? WPFで将来移動する予定がある場合は、これを知ることをお勧めします。 同期コンテキストは、スレッド間メッセージを処理する標準的な移植可能な方法です。 System.Web、windowsフォーム、wpf、カスタム同期コンテキストから各システムのバージョンがあります。

public static class MyClass 
{ 
    public static void MyFunction(MyObject messageReceived) 
    { 
     // Call this stuff from non-gui thread. 

     SynchronizationContext syncContext = SynchronizationContext.Current; 
     syncContext.Send(MyMethod, param); 

     // You can also use SyncContext.Post if you don't need to wait for completion. 
     syncContext.Post(MyMethod, param); 
    } 

    private static void MyMethod(object state) 
    { 
     MyObject myObject = state as MyObject; 
     ... do my stuff into the gui thread. 
    } 

    // Using anonymous delegates you can also have a return value using Send. 
    public static int MyFunctionWithReturnValue(MyObject parameter) 
    { 
     int result = 0; 
     SynchronizationContext.Current.Post(delegate (object p) 
     { 
      result = parameter.DoSomething() 
     }, null); 

     return result; 
    } 
} 
0

問題はSynchronizationContextで解決できます。要約すると、UIスレッドのSynchronizationContextをキャプチャし、Postメソッドを使用してGUIメッセージループに項目を投稿します。あなたが優れた記事を見つけることができるので、多くを書く必要はありませんHere

-1

申し訳ありません私の質問で忘れました。私はまた、静的クラスでSystem.Windows.Formsクラスを使用することを避けたかったのです。

私が見つけた最も簡単な方法は、デベロッパーオブジェクトからInvokeメソッドを呼び出すことです(前に試したように、動作しませんでした)。そして、デリゲートの方法でこれを実行します。

if (this.InvokeRequired) 
    this.Invoke(MethodWhichDoesRealStuff, new object[] { message }); 
else 
    MethodWhichDoesRealStuff(message); 

はまた、私は実際に私のクラスでデリゲートのリストを管理するために持っていなかったことに気付きました。イベントは私にとってまさにそれです。

関連する問題