VSIX - Deadlock auf XmlEditingScope.Complete ()

9

Wir verwenden die Klassen im Namespace von Microsoft.VisualStudio.XmlEditor ( Ссылка ), um ein XML-Dokument in einer Visual Studio-Erweiterung zu ändern.

Aus irgendeinem Grund tritt nach dem Aufruf des XmlEditingScope.Complete () Methode. In der Statusleiste von Visual Studio wird die Meldung "Warten auf Parsing abgeschlossen ..." angezeigt.

Dies ist der Stack-Trace des festgefahrenen UI-Threads:

%Vor%

Und der Visual Studio-Thread:

%Vor%

Es ist nicht einfach, den gesamten relevanten Code hier anzuzeigen, aber im Grunde ist es nur der folgende Code, der nach einer Änderung in einem WPF DataGrid-Steuerelement (IEditableObject.EndEdit in ViewModel) ausgeführt wird:

%Vor%

Was kann ich tun, um diesen Deadlock zu verhindern? Muss ich etwas sperren, bevor ich die Änderungen anwende? Was könnte ich sonst falsch machen?

    
TWT 08.04.2016, 07:19
quelle

1 Antwort

0

Es ist eher ein Kommentar, passt aber nicht in ein Kommentarfeld. Es ist schwierig, den genauen Grund zu nennen, warum dies in Ihrem Fall passiert, oder eine Möglichkeit zu geben, es mit den von Ihnen bereitgestellten Informationen zu beheben (um mehr Hilfe zu erhalten, benötigen wir ein minimales Beispiel, das wir einfach ausführen und das Problem sehen können). Stacktraces zeigen jedoch, dass es sich hierbei um einen regulären UI-Deadlock handelt, der häufig in fast allen UI-Frameworks auftritt, weil sie "single threaded" sind (alle Aktionen mit UI-Elementen müssen auf einem einzelnen Thread ausgeführt werden). Thread A (in diesem Fall Visual Studio-Analysethread) sendet eine Aufgabe an die UI-Threadwarteschlange aus dem Hintergrundthread und wartet darauf, dass sie abgeschlossen wird (z. B. WPF Dispatcher.Invoke-Aufruf, der genau das tut). Es ist nicht notwendig, dass die gesamte Aufgabe auf dem UI-Thread ausgeführt wird, damit Deadlock auftritt, nur ein Teil davon (z. B. - tatsächliches XML aus UI-Steuerelement abrufen) ist ausreichend. Dann machen Sie dasselbe auf dem UI -Thread. Das ist warte auf einige Wait-Handles im UI-Thread (die Verwendung von Sperranweisungen auf dem UI-Thread fällt in dieselbe Kategorie). Dies ist extrem gefährlich und führt zu Deadlocks, die Sie (wahrscheinlich) in diesem Fall haben.

Ich werde meinen Punkt mit diesem kleinen Beispiel (WPF) illustrieren:

%Vor%

In Ihrem Fall scheint XmlEditingScope.Complete auf dem UI-Thread ausgeführt zu werden und wartet auf ParseWaitHandle, was ein Verhalten ist, das Sie vermeiden sollten. Um das Problem zu beheben, können Sie versuchen, die Ausführung Ihres obigen Codes im Benutzeroberflächen-Thread zu vermeiden und stattdessen im Hintergrund-Thread zu laufen.

    
Evk 11.04.2016 11:29
quelle