1

私は常に、SynchronizationContext を使用して別のスレッドへの呼び出しをマーシャリングできると考えていました。SyncCtx.Send() は指定されたデリゲートを呼び出す以外に何もしない (同じスレッドにとどまる) ため、どうやら私は間違っていたようです。SynchronizationContext から派生させて、スレッド コンテキストで作業する必要は本当にあるのでしょうか? 何かが足りない気がします。

達成したいこと: アプリ内でコマンドを実行するための小さな API を想像してみてください。コマンドの実行が終了したときに実行するデリゲートを割り当てることができるため、バックグラウンド スレッドでコマンドを実行することもできます。この "Call-me-when-done"-Delegate は、成功/失敗フラグ、オプションの例外情報などを含む 1 つのパラメーター (状態) を取得します。このデリゲートを元の呼び出しスレッドで呼び出して、lib を使用する開発者が必要な呼び出しなどを処理する必要があります。これを取り除いて、単純な非スレッド認識プログラミングを実行させたいと思います。WindowsFormsSynchronizationContext は、ターゲットとして何らかの制御を与えない限り、どちらも役に立たないようです。

助けてくれてありがとう!

4

1 に答える 1

0

winforms で同期コンテキストを使用すると、呼び出しは GUI スレッドにマーシャリングされます。

あなたの特定のケースでは、このようなものがうまくいくと思います。おそらく、を表すクラスを作成することをお勧めしますCommand

public class CommandManager
{
    private readonly SynchronizationContex _synchronizationContex;

    public CommandManager(SynchronizationContext synchronizationContex)
    {
        _synchronizationContex = synchronizationContex;
    }

    public void ExecuteAsync(Func<State> action, Action<State> callback)
    {
        ThreadPool.QueueUserWorkItem(o => {
                                             state = action();
                                             _synchronizationContex.Send(oo => callback(state));
                                          });
    } 
}

このように作成します(GUIスレッドで、たとえばメインフォームで)

var commandManager = new CommandManager(SynchronizationContext.Current);

次のように使用します。

commandManager.ExecuteAsync(() => new State() { Success = true }, 
                             c => MessageBox.Show("success in the GUI thread"));
于 2011-12-19T09:00:18.793 に答える