Отправка сообщения в поток графического интерфейса Windows

StackOverflow https://stackoverflow.com/questions/221287

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

    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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top