質問

Webサービスオブジェクト(SoapHttpClientProtocolから継承)を作成し、Asyncメソッドを使用すると、Windows GUIスレッドでコールバックが行われることに気付きました。

  1. この仕組みを知っている人はいますか
  2. どうすれば同じことを達成できますか。

これにより、GUIスレッドでコールバックが常に発生していると確信している場合、GUIフォームでInvokeRequiredを確認する必要がなくなります。

他のヒント

素晴らしい。答えてくれてありがとう。どちらのオプションも機能しているようで、長所があります。

テストに使用したサンプルコードは次のとおりです。

    public partial class AsyncTest : Form
    {
        static void Main()
        {
            Application.Run(new AsyncTest());
        }

        AsyncOperation _operation;
        SynchronizationContext _context;
        TextBox _textBox;
        public AsyncTest()
        {
            _operation = AsyncOperationManager.CreateOperation(null);
            _context = WindowsFormsSynchronizationContext.Current;
            _textBox = new TextBox();
            this.Controls.Add(_textBox);
            new Thread(AsyncThread).Start();
        }

        void AsyncThread()
        {
            _operation.Post(GuiThread, null);
            _context.Post(GuiThread, null);
        }

        void GuiThread(object state)
        {
            _textBox.Text = _textBox.InvokeRequired ? "Didn't work" : "It Worked";
        }
    }

メインスレッドでWindowsFormsSynchronizationContextオブジェクトを作成し、別のスレッドでそのSendメソッドを呼び出すことができます。

scroll top