Invio di un messaggio al thread della GUI di Windows
-
03-07-2019 - |
Domanda
Ho notato che quando si crea un oggetto del servizio Web (ereditando da SoapHttpClientProtocol) e si utilizza il metodo Async, effettua il callback sul thread della GUI di Windows.
- Qualcuno sa come funziona?
- Come posso ottenere la stessa cosa.
Immagino che questo mi eviterà di dover controllare InvokeRequired nei miei moduli GUI se sono sicuro che il callback si verifica sempre sul thread gui.
Soluzione
Sospetto che usi AsyncOperationmanager.SynchronizationContext per ottenere staticamente un contesto di sincronizzazione. Ciò consente quindi di pubblicare i callback in modo appropriato.
Altri suggerimenti
brillante. Grazie per le risposte Entrambe le opzioni sembrano funzionare e hanno i loro punti di forza.
Ecco il codice di esempio che ho usato per testare con:
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";
}
}
Puoi creare un oggetto WindowsFormsSynchronizationContext nel thread principale e quindi, su un thread diverso, chiamarne il metodo Send.