2016-04-04 13 views
0

Ich habe einen langen laufenden Prozess rufen wir ProcessA, also möchte ich eine "Bitte warten ..." Typ-Dialogbox, um den Benutzer davon abzuhalten, zu versuchen um mit der Anwendung zu interagieren und sicherzustellen, dass sie keine "Keine Antwort" -Typinfos/Fehler erhalten (zB die Möglichkeit zum Beenden des Prozesses)Modal "Bitte warten" -Dialogfeld mit möglicher Benutzeroberfläche im Hintergrund Prozess

Mein erster Gedanke ist, einen Hintergrundarbeiter einzurichten, der den Job erledigt und einen modales Dialogfeld im Vordergrund und schließen Sie es, wenn ProcessA abgeschlossen ist. Das Problem ist jedoch, dass ProcessA am Ende eine eigene Dialogbox öffnet und dann etwas druckt.

Wenn also der Benutzer irgendwo auf die Anwendung klickt, verschwindet das Dialogfeld von ProcessA hinter dem Anwendungsfenster.

Also wie kann ich die "Bitte warten" anzeigen, aber auch die Interaktion mit der Hauptanwendung verhindern, während sie nicht angezeigt wird, während ProcessA läuft?

ProcessA läuft von einer DLL und ich habe keinen Zugriff auf seinen Code. (So ​​kann ich das "Bitte warten" nicht schließen, wenn es bereit ist, seine eigene Dialogbox zu zeigen)

+0

Sie versuchen API gewinnen konnte fordert den Druckdialog auf ProzessA zeigt zu überwachen? – James

Antwort

0

Hier ist ein naives Beispiel.

class MyForm : Form { 
    private void Form_Load() { 
     ThreadPool.QueueUserWorkItem(_=>{ 
      Form frmDialog = new Form(); 
      //Cross-thread InvokeRequired 
      this.BeginInvoke(new Action(()=>{ 
       frmDialog.ShowDialog(this); 
      })); 

      // to do long-time work here 

      // Cross-thread InvokeRequired 
      this.Invoke(new Action(()=>{ 
       frmDialog.Dispose(); 
       // frmDialog.Close(); the Close method doesn't release the frmDialog, just make it invisible. (Memory leak !!!) 
      })); 
    } 
} 
+0

Fehler bekommen, aber mit leichten Änderungen, habe es zu bauen ('this.Invoke (new Action (() => ...'). Leider hat das Problem nicht gelöst, dass das Dialogfeld von der langen Zeit ProcessA hinter sich verschwinden würde das Hauptanwendungsfenster, wenn ich woanders klicke – colmde

+0

Sorry, ich bearbeite es einfach mit sublime auf meinem MacBook. @colmde Könntest du bitte deinen Beispielcode posten? – ROY

+0

Sorry, ich hatte es gelöscht, nachdem es nicht so funktioniert hatte, wie ich es wollte, aber Ich habe Ihren Code auf das geändert, was ich getan habe (ich hoffe, es macht Ihnen nichts aus) – colmde

0

Meine eventuelle Auflösung war nur ein modalen verwenden „Bitte warten“, nicht perfekt, aber hoffentlich wird jetzt akzeptabel sein ...

_pleaseWaitForm.Show(); 
_pleaseWaitForm.Refresh(); 

DisableProcessWindowsGhosting(); 

ProcessA(); // Long running process 

_pleaseWaitForm.Close(); // or maybe should it be Dispose()? 

Seit ProzessA bindet die Benutzeroberfläche es Interaktion mit dem Benutzer verhindert trotzdem, und DisableProcessWindowsGhosting() verhindert die Meldung "Keine Antwort" oder der Benutzer die Anwendung zu schließen, wenn sie ungeduldig werden.

Ein bisschen schlampig, so bin ich immer noch offen für eine elegantere Antwort ...