Web サービス オブジェクト (SoapHttpClientProtocol から継承) を作成し、Async メソッドを使用すると、Windows GUI スレッドでコールバックが行われることに気付きました。
- これがどのように機能するか知っている人はいますか?
- どうすれば同じことを達成できますか。
GUIスレッドでコールバックが常に発生していると確信している場合、これにより、GUIフォームでInvokeRequiredをチェックする必要がなくなると思います。
Web サービス オブジェクト (SoapHttpClientProtocol から継承) を作成し、Async メソッドを使用すると、Windows GUI スレッドでコールバックが行われることに気付きました。
GUIスレッドでコールバックが常に発生していると確信している場合、これにより、GUIフォームで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 メソッドを呼び出すことができます。