2 Stimmen

Ist es möglich, einen Wert mit SynchronizationContext.Send zurückzugeben?

Wir haben ein Bedürfnis, SynchronizationContext zu verwenden, um einen Wert (speziell ein MessageBox DialogResult) über Send zurückzugeben (wir möchten keine asynchrone Übertragung über 'Post'). Bin mir nur nicht sicher über die Syntax. Wir hatten Probleme mit dem MessageBox, das sich hinter dem Hauptfenster verbarg, was vermutlich darauf zurückzuführen war, dass der Hauptformularwert IWin32Window nicht einfach zugänglich war...Wir verwenden dies, aber ehrlich gesagt fühle ich mich damit unwohl.

 DialogResult dr;
 SynchronizationContext synchContext;

 //im Konstruktor des Hauptformulars
 {
       ...
       synchContext = AsyncOperationManager.SynchronizationContext;
 }

 void workerThread( object obj, DoWorkEventArgs args)
 {

   // SynchronizationContext wird dem Worker-Thread über args übergeben
   sc.Send( delegate {dr = MessageBoxEx.Show( "Ja oder nein?", "Weiter?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question );},null);
 }

0voto

Jean Hominal Punkte 16038

Sie können ein object in den Delegaten übergeben, den Sie an Send übergeben.

Also hier ist, was ich tun würde:

class DialogResultReference
{
    internal DialogResult DialogResult { get; set; }
}
class YourClass
{
    static void ShowMessageBox(object dialogResultReference)
    {
        var drr = (DialogResultReference)dialogResultReference;
        drr.DialogResult = MessageBoxEx.Show("Ja oder nein?", "Weiter?",   MessageBoxButtons.OKCancel, MessageBoxIcon.Frage);
    }

    // ... Du entfernst einfach dr aus der Klasse
    SynchronizationContext synchContext;

    //im Konstruktor der Hauptform
    {
        ...
        synchContext = AsyncOperationManager.SynchronizationContext;
    }

    void workerThread(object obj, DoWorkEventArgs args)
    {
        var drr = new DialogResultReference();
        sc.Send(YourClass.ShowMessageBox, drr);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X