[Gelöst] Warten bis Berechnungen (Word Interop) abgeschlossen sind
-
Hallo,
ich schreibe grad ein C#-Programm welches intern Word aufruft und dann irgendwelche Wordfunktionen benutzt. Das Probelm ist das wenn ich Word starte und dann die nächste Wordfunktion aufrufe, der Start-Befehl erst abgeschlossen sein muss bevor ich weitere Dinge mit Word tun kann. Sonst bekomme ich eine "Server ist ausgelastet"-Nachricht und muss solange "wiederholen" drücken bis die Berechnung weitergeht.
Beispiel:
WordDoc = WordApp.Documents.[b]Open[/b](ref MasterFileName, ref MyFalse, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef); object start = 0; object end = WordDoc.Characters.Count; Range rng = WordDoc.Range(ref start, ref end); if (rng.[b]Find[/b].Execute(ref TitelTag, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef, ref MissingRef)) { rng.Select(); rng.Text = ProjectShortCut; rng.WholeStory(); }
Bei diesem Beispiel öffne ich zuerst Word mit open und suche dann nach einem bestimmten Wort mit find. Ist der open-Befehl noch nicht abgeschlossen, so kann offensichtlich auch noch nicht damit begonnen werden zu suchen.
Wie kann ich nun abwarten bis ein Befehl abgeschlossen ist, bevor ich mit dem nächsten weitermache? Ich denke es geht in Richtung Threading? Oder gibt es da noch andere Ansätze? Kann mir da mal jemand ein paar Hinweise geben, damit ich weiterkomme?
Danke
-
Ich frage mich grad ob ich da einem Trugschluss unterliege.
Wird der open-Befehl einfach nur abgesetzt und dann mit dem Programm fortgefahren. Oder wird nicht sowieso darauf gewartet, dass der open-Befehl das WordDoc-Object zurückliefert.Naja egal ob der open-Befehl was zurückgeliefert hat oder nicht, wenn Word "busy" ist geht halt nichts.
Sehe ich das richtig ?
-
Thread Pool... asycnron arbeiten, events etc.
-
jo.
BorisDieKlinge schrieb:
Thread Pool... asycnron arbeiten, events etc.
Wofür braucht man hier bitte einen threadpool? Es gibt nur 2 Threads.
Fliegt ne Exception? Dann fang sie und versuch es nochmal. Ansonsten gibt die WordDoc-API sicherlich Funktionalität zum Abfragen des Dokument-Status.
Vielleicht hilft ja auch ein einfaches
Thread.Sleep(5000);
Grantopalen.
-
Habe ne Lösung gefunden...
Man muss das Interface IMessageFilter implementieren und dann die Funktion RetryRejectedCall seinen Bedürfnissen entsprechend implementieren. Ich mache einfach nix und warte ein paar Millisekunden.
Die implementiete Klasse muss man dann in sein Programm per using einbinden:
using (MessageFilter messageFilter = new MessageFilter()) { // Betroffener Code }
Details für C# und VB stehen hier:
Danke für eure Anteilnahme.
p.s.: Was soll dieses Grantopalen? Ist das ne Beleidigung oder gar eine Krankheit? Oder hast du etwa eine besonders aggressive Form des Tourette-Syndroms, welches sich auch auf der Tastatur manifestiert?
-
Besten Dank für das Posten der Lösung für Dein Problem. Sieht man viel zu selten