Отправка сообщения в поток Windows GUI - PullRequest
4 голосов
/ 21 октября 2008

Я заметил, что когда вы создаете объект веб-службы (наследующий от SoapHttpClientProtocol) и используете метод Async, он выполняет обратный вызов в потоке графического интерфейса Windows.

  1. Кто-нибудь знает, как это работает?
  2. Как мне достичь того же?

Полагаю, это избавит меня от необходимости проверять наличие InvokeRequired в формах GUI, если я уверен, что обратный вызов всегда происходит в потоке графического интерфейса.

Ответы [ 3 ]

4 голосов
/ 21 октября 2008

Я подозреваю, что он использует AsyncOperationmanager.SynchronizationContext , чтобы статически получить контекст синхронизации. Это тогда позволяет вам отправлять обратные вызовы соответствующим образом.

2 голосов
/ 21 октября 2008

Brilliant. Спасибо за ответы. Оба варианта, кажется, работают и имеют свои сильные стороны.

Вот пример кода, с которым я тестировал:

    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";
        }
    }
1 голос
/ 21 октября 2008

Вы можете создать объект WindowsFormsSynchronizationContext в основном потоке, а затем в другом потоке вызвать его метод Send.

...