Отправка сообщения в поток графического интерфейса Windows
-
03-07-2019 - |
Вопрос
Я заметил, что когда вы создаете объект веб-службы (наследующий от SoapHttpClientProtocol) и используете метод Async, он выполняет обратный вызов в потоке графического интерфейса Windows.
- Кто-нибудь знает, как это работает?
- Как я могу добиться того же?
Я полагаю, что это избавит меня от необходимости проверять 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.