Frage

Mir ist aufgefallen, dass beim Erstellen eines Webdienstobjekts (Erben von SOAPHTTPCLIENTPROTOCOL) und Sie die asynchronisierende Methode verwenden, der Rückruf auf dem Windows -GUI -Thread.

  1. Weiß jemand, wie das funktioniert?
  2. Wie kann ich dasselbe erreichen?

Ich denke, dies wird mir retten, dass ich nach in meinen GUI -Formularen aufgerufen werden muss, wenn ich sicher bin, dass der Rückruf immer auf dem GUI -Thread stattfindet.

War es hilfreich?

Lösung

Ich vermute, es verwendet es AsyncoperationManager.SynchronizationContext statisch einen Synchronisationskontext erhalten. Dadurch können Sie dann Rückrufe angemessen veröffentlichen.

Andere Tipps

Brillant. Danke für die Antworten. Beide Optionen scheinen zu funktionieren und haben ihre Stärken.

Hier ist der Beispielcode, mit dem ich getestet habe:

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

Sie können ein WindowsFormsSynchronizationContext -Objekt im Haupt -Thread erstellen und dann in einem anderen Thread seine Send -Methode aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top