2008-10-21 3 views
4

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

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

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

ответ

4

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

1

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

2

Блестящий. Спасибо за ответы. Оба варианта, похоже, работают и имеют свои сильные стороны.

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

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"; 
     } 
    } 
Смежные вопросы