Pregunta

He notado que cuando crea un objeto de servicio web (heredado de SoapHttpClientProtocol) y usa el método Async, hace la devolución de llamada en el hilo de la GUI de Windows.

  1. ¿Alguien sabe cómo funciona esto?
  2. ¿Cómo puedo lograr lo mismo?

Supongo que esto me ahorrará tener que verificar InvokeRequired en mis formularios GUI si estoy seguro de que la devolución de llamada siempre se produce en el hilo de la interfaz gráfica de usuario.

¿Fue útil?

Solución

Sospecho que usa AsyncOperationmanager.SynchronizationContext para obtener estáticamente un contexto de sincronización. Esto le permite publicar devoluciones de llamada adecuadamente.

Otros consejos

Brillante. Gracias por las respuestas Ambas opciones parecen funcionar y tienen sus puntos fuertes.

Aquí está el código de ejemplo que solía probar:

    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";
        }
    }

Puede crear un objeto WindowsFormsSynchronizationContext en el hilo principal y luego, en un hilo diferente, llamar a su método Send.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top