Question

J'ai remarqué que, lorsque vous créez un objet de service Web (héritant de SoapHttpClientProtocol) et que vous utilisez la méthode Async, le rappel est effectué sur le thread d'interface graphique Windows.

  1. Quelqu'un sait-il comment cela fonctionne?
  2. Comment puis-je obtenir la même chose?

Je suppose que cela évitera de rechercher InvokeRequired dans mes formulaires d'interface graphique si je suis sûr que le rappel a toujours lieu sur le thread d'interface graphique.

Était-ce utile?

La solution

Je suppose qu'il utilise AsyncOperationmanager.SynchronizationContext pour obtenir statiquement un contexte de synchronisation. Cela vous permet ensuite de poster des rappels de manière appropriée.

Autres conseils

Brillant. Merci pour les réponses. Les deux options semblent fonctionner et ont leurs points forts.

Voici l'exemple de code que j'avais l'habitude de tester avec:

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

Vous pouvez créer un objet WindowsFormsSynchronizationContext dans le thread principal, puis appeler sa méthode d'envoi sur un autre thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top