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.

  1. Qualcuno sa come funziona?
  2. 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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top