Laden...

DTE ExecuteCommand: Zweites Kommando erst ausführen, wenn das erste abgeschlossen ist

Erstellt von unknown vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.732 Views
U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren
Hinweis von herbivore vor 10 Jahren

DTE is the top-level object in the Visual Studio automation object model.

DTE ExecuteCommand: Zweites Kommando erst ausführen, wenn das erste abgeschlossen ist

HI =)

Ich habe zwei Befehle die nacheinander ausgeführt werden sollen. Die Betonung liegt auf nacheinander, denn die zweite Zeile wartet nicht auf die erste Zeile.

mein Code:

m_Solution.DTE.ExecuteCommand("ersteAufgabe");
                                                                           
m_Solution.DTE.ExecuteCommand("zweiteAufgabe");

"ersteAufgabe" benötigt xy Minuten Zeit (recht lange aber das ist in Ordnung). Wichtig ist nur das "zweiteAufgabe" erst nach diesen xy Minuten beginnt.

Ich habe garkeine Idee wie ich das umstzen könnte. 🙁 Jemand einen Tipp?

Wer der Herde folgt sieht immer nur Ärsche

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo unknown,

mit den Informationen die du uns gibst arbeitet der Code synchron. D.h. die Methoden werden genau in der Reihe aufgerufen wie sie im Code stehen.

Arbeiten diese Methoden intern asynchron? Und um welchen Kontext gehts überhaupt? Stell dir vor, die Frage liest jemand der von deinem Problem gar keine Ahnung hat und ob dieser dann weiß worum es geht. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.941 Beiträge seit 2005
vor 10 Jahren

Hallo zusammen

Beschäftige mich im Moment auch in einem ähnlichen Bereich.
Es soll Commands geben, die intern synchron laufen "File => New Project" z.B. aber auch solche die asynchron laufen, wie "Build Project".

Daher wäre es wichtig, den Kontext zu kennen.

Hier ein Beispiel, wie spezifisch auf ein "Build Command" eingegangen wird:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren

Die Datei "SchemaCompare.scmp" aus meinem Projekt ist geöffnet. Nun wird der SQL Schema Vergleich über SSDT gestartet:

//Schemavergleich starten                          

m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichVergleichen");

danach wird das Script generiert:

//Skript generieren                                                         

m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichSkriptGenerieren");

oder eben auch nicht, weil "SQL.SSDTSchemavergleichSkriptGenerieren" nicht ausgeführt werden kann wenn "SQL.SSDTSchemavergleichVergleichen" noch dabei ist zu vergleichen.
Das ist der gesamte Code der Methode.

Wer der Herde folgt sieht immer nur Ärsche

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren
DTE ExecuteCommand: Zweites Kommando erst ausführen, wenn das erste abgeschlossen ist

HI 🙂

Ich habe ein Add In für Visual Sutdio gebastelt, dieses gibt dem geöffnetem Programm die Anweisung ein Schmevergleich über SSDT zu starten.

m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichVergleichen");

jetzt soll das Add In warten bis das Programm den Vergleich beendet hat und erst dann die nächste Funktion ausführen. Also sozusagen:

if(geöffnetesProgramm ist fertig mit Vorgang)
{
      doSomething();
}
else
{
     wait();
}

Application.DoEvents(); bringt da natürlich herzlich wenig, denn er wartet dann bis er den Schemavergleich gestartet hat und nicht weiter,schließlich ist seine Aufgabe damit ja auch beendet.

Jemand eine Idee? X(

Wer der Herde folgt sieht immer nur Ärsche

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren
Hinweis von Abt vor 10 Jahren

Da sich die Fragen inhaltlich nicht unterscheiden, sondern nur in der Formulierung, habe ich die Themen zusammen gefügt.
[Hinweis] Wie poste ich richtig? 1.2 und 2.2

Wer der Herde folgt sieht immer nur Ärsche

5.941 Beiträge seit 2005
vor 10 Jahren

Hallo unknown

Ich kenne SSDT überhaupt nicht.
Am besten wäre es, wenn du über DTE z.B. prüfen könntest. z.B. ob eine Datei erstellt wurde, der Build fertig ist.

Ob diese Möglichkeit besteht, kann ich dir aber nicht sagen.

Sonst bleibt dir nur noch die Möglichkeit, wie folgt im Link beim vorherigen Beitrag beschrieben. Warten mit einem Timer, wenn du ungefähr weisst, wie lange es geht.

Oder: warten, nächste Aktion probieren, wenn nicht erfolgreich, warten usw.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren

Hallo Peter

leider wird dabei keine Datei erstellt, sonst wäre deine Lösungsidee echt schön gewesen.
Den Timer kann ich nicht verwenden, da sich die Zeit je nach geöffnetem Programm unterscheiden wird.
Ich habe es mit "probieren, warten, probieren" versucht:


//Schemavergleich starten          
                    m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichVergleichen");
                    Application.DoEvents();

                    bool fertig = false;
                    while (!fertig)
                    {
                        try
                        {
                            //Skript generieren                                      
                            m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichSkriptGenerieren");

                            fertig = true;
                        }
                        catch (Exception)
                        {
                            System.Threading.Thread.Sleep(100);
                            fertig = false;
                        }
                    }

aber irgendwie hängt der jetzt total fest und beginnt nicht einmal richtig den Schemavergleich.
Vielleicht mache ich irgendeinen blöden Fehler bei der while-Schleife? Lasse ich ihn zu lange oder zu wenig "schlafen"?

Arbeitet hier denn keiner mit SSDT ? 🙁

Wer der Herde folgt sieht immer nur Ärsche

L
416 Beiträge seit 2008
vor 10 Jahren

Prinzipiell würde ich das Warten besser über einen Timer lösen (vmtl blockiert das Sleep) und dann auch deutlich länger. Du sagst der erste Vorgang dauert durchaus mehrere Minuten da brauchst du dann ja nicht alle 100ms prüfen, alle 10s sollte akzeptabel sein oder?
Und lass bitte das DoEvents weg 😉.

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren

habe es gerade auf 20 sek geändert und warte jetzt 10 Minuten. Wenn der Vergleich dann immernoch nicht richtig gestartet wurde, versuche ich mal den Timer.

ja, das DoEvents(); ist schon draußen 😄

Wer der Herde folgt sieht immer nur Ärsche

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren

läuft auch mit Timer nicht..

Wer der Herde folgt sieht immer nur Ärsche

L
416 Beiträge seit 2008
vor 10 Jahren

läuft auch mit Timer nicht..

Dann zeig mal deine "Timer-Umsetzung".

U
unknown Themenstarter:in
10 Beiträge seit 2013
vor 10 Jahren
private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

//Schemavergleich starten          
                    m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichVergleichen");

//Timer                   
timer.Interval = 20000;
timer.Tick += new EventHandler(TimerEvent);
timer.Start();

 private void TimerEvent(Object myObject, EventArgs myEventArgs)
        {
            try
            {
                //Skript generieren                                      
                m_Solution.DTE.ExecuteCommand("SQL.SSDTSchemavergleichSkriptGenerieren");
                timer.Stop();
            }
            catch
            {               
            }
        } 

Wer der Herde folgt sieht immer nur Ärsche