Pergunta

Percebi que quando você cria um objeto de serviço da Web (herdando do SoAPHTTPClientProtocol) e usa o método Async, ele faz o retorno de chamada no thread Windows GUI.

  1. Alguém sabe como isto funciona?
  2. Como posso conseguir a mesma coisa.

Eu acho que isso me salvará a ter que verificar se há invocados nos meus formulários da GUI, se tiver certeza de que o retorno de chamada está sempre ocorrendo no thread da GUI.

Foi útil?

Solução

Eu suspeito que usa AsyncoperationManager.synchronizationContext Para obter um contexto de sincronização estaticamente. Isso permite que você publique retornos de chamada adequadamente.

Outras dicas

Brilhante. Obrigado pelas respostas. Ambas as opções parecem funcionar e têm seus pontos fortes.

Aqui está o código de amostra que eu usei para testar:

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

Você pode criar um objeto WindowsFormSsynchronizationContext no encadeamento principal e, em um encadeamento diferente, chame seu método de envio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top