2011-01-05 16 views
2

から何らかの方法で信号を送ることによって、メインスレッドからメソッド「呼び出し」強制的にどのように、私は「質問C#の:他のスレッド長いタイトルのために申し訳ありません

を表現する方法についても、道を知りませんメインスレッド(Cライブラリ)とは別のコンテキストからコールバックを実行するライブラリを使用して、C#でコールバックを作成し、呼び出されたときにイベントを発生させたいだけです。

しかし、私はイベントの中に何が入っているのか分からないので、私はロックなどの問題なしにメソッドを呼び出す方法を見つけたいと思います(そうでなければ、サードパーティのユーザーはこれをイベント、非常に醜い)

これを行う方法はありますか? 私は間違った方法で完全にすることができますが、私は別のスレッド(.Invokeのもの)を処理するwinformsの方法について考えています

そうでなければ、ウィンドウのメッセージループにメッセージを送信できますメッセージパッシングについて多くを知っていると私は、この

例のように「カスタム」のメッセージ送信できる場合:このコールバックは、私は、私がコントロールの上に持っていない他のプログラムからなり呼ばれる

private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) 
{ 
    OnConfigure(EventArgs.Empty); 
    return 0U; 
} 

をメインスレッド(私のwを処理するもの)でOnConfigureメソッドを実行するように通知)、それを行う方法? や他の言葉で、私はロック

編集1について考える必要がなくOnConfigureを実行したいと思います:

私はこの例外に問題があります:コールバック:

CallbackOnCollectedDelegateは メッセージをretrived代理人 'G19dotNet!G19dotNet.LgLcd + lgLcdOnSoftButtonsCB :: Invoke'をGarbageCollectorで収集して実行します。アンマネージコードの代表者の間に確保されなければならないあなたは、彼らが編集2

と呼ばれることはありませんことを確認するまで削除されません。自分で解決

号、いつも私を助けにStackOverflowに感謝を! 将来の参照用に:Defining a delegate as a function pointer

+0

していることのコードサンプルを投稿してください。 –

+0

質問を確認し、コード例を追加しました –

答えて

5

何がで終わることは、このようになります。 (ButtonまたはFormなど)がそのスレッドで作成されました。これを行うには参照が必要です。例えば

、あなたのコードで、あなたは、フォームへの参照がformと呼ばれていると仮定:

private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) 
{ 
    form.Invoke(new MethodInvoker(() => OnConfigure(EventArgs.Empty))); 
    return 0U; 
} 
3

第三者の関数を呼び出す前に、Dispatcher.CurrentDispatcherへの参照を取得してください。コールバック関数では、dispatcher.Invokeを使用します。あなたはリサイズを使用していて、UIスレッド上で何かを実行したい場合は、あなたには、いくつかのコントロールにInvokeBeginInvokeのいずれかを呼び出す必要が

class MyClass 
{ 
    private Dispatcher dispatcher; 
    public void runThirdParty() 
    { 
     this.dispatcher = Dispatcher.CurrentDispatcher; 
     callThirdPartyFunction(myCallBack); 
    } 

    public void myCallBack() 
    { 
     this.dispatcher.Invoke(new Action(() => 
     { 
      //code to run here. 
     })); 
    } 
} 
+0

ありがとう、私はそれをテストしています –

+0

ディスパッチャはWPFのみです。彼はWinFormsを使用しているようです。 –

+1

@Adam Robinson:DispatcherはWPFだけでなく、コンソールアプリケーションまたはWinFormsでも動作します。 System.Windows.Threadingへの参照を追加するだけです。 –

3

このためのパターンがありますがEvent-based Asynchronous Patternと呼ばれます。リンクされた記事は、それを使用する方法の素晴らしい概要です。 AsyncOperationクラスがこのパターンの鍵です。

このパターンは、あなたが解決しようとしている問題に完全に適合していないかもしれませんが、問題についてのいくつかの洞察を与えるかもしれません。

+0

このデザインパターンは非常に興味深いです、私はそれを勉強しています、私は多くの進行バーが好きです。 –

関連する問題