2017-08-29 3 views
0

Ich habe eine PXLongOperation in meinem Code, ich finde keinen Weg, um zu wissen, ob der Benutzer den Vorgang abgebrochen hatte.So behandeln Sie die Stornierung von PXLongOperation

public PXAction<SomeFilter> someUpdate; 
     [PXButton(CommitChanges = true)] 
     [PXUIField(DisplayName = "Update")] 
     public void SomeUpdate() 
     { 
      if (this.Base.Filter.Current == null) 
       throw new PXException("Please choose val."); 

      PXLongOperation.StartOperation(this.Base,() => 
          SomeOperation(this.Base.Filter.Current)      
      ); 
     } 

private void SomeOperation(SomeFilter filter) 
{ 
    //how to know user cancelled operation or not? 
} 
+0

Wenn die Sorge verhindert, dass der Benutzer den Prozess, den Sie wieder zum Laufen kann nach der Verarbeitung suchen, die mit so etwas läuft ... PXLongOperation.GetStatus (Base.UID) == PXLongRunStatus.InProcess – Brendan

+0

Ich muss innerhalb des Threads wissen, ob der Vorgang abgebrochen wird oder nicht. Gibt es eine Option wie das Stornierungs-Token in C#? – Hybridzz

+0

Ich glaube, der Prozess sollte einfach abgebrochen werden, wenn der Benutzer auf Abbrechen klickt. Es ist möglicherweise nicht sofort, wenn der Benutzer auf Abbrechen klickt, aber irgendwann abbrechen sollte. – Brendan

Antwort

0

Sie können das Ergebnis der PXLongOperation mit der PXCustomInfo-Schnittstelle abrufen. SetCustomInfo wird verwendet, um den Rückruf einzurichten und PXLongRunStatus enthält das Ergebnis:

PXLongOperation.StartOperation(Base,() => 
{ 
    PXLongOperation.SetCustomInfo(new PXLongOperationCallback()); 
    SomeOperation(Base.Filter.Current) 
}); 

public class PXLongOperationCallback : IPXCustomInfo 
{ 
    public void Complete(PXLongRunStatus status, PXGraph graph) 
    { 
     switch (status) 
     { 
      case PXLongRunStatus.Aborted: 
       break; 

      case PXLongRunStatus.Completed: 
       break; 

      case PXLongRunStatus.InProcess: 
       break; 

      case PXLongRunStatus.NotExists: 
       break; 
     } 
    } 
} 

Code-Beispiel für die Fehlerbehandlung von Callback-Betrieb:

public void Complete(PXLongRunStatus status, PXGraph graph) 
{ 
    if (status == PXLongRunStatus.Completed && graph is MyGraph) 
    { 
     ((MyGraph)graph).RowSelected.AddHandler<MyDac>((sender, e) => 
     { 
      MyDac row = e.Row as MyDac; 

      if (row != null) 
      { 
       sender.RaiseExceptionHandling<MyDac.myField>(row, row.MyField, "Error Message"); 
      } 
     }); 
    } 
} 
+0

Ich muss innerhalb des Threads wissen, ob die Operation abgebrochen wird oder nicht. Gibt es eine Option wie das Stornierungs-Token in C#? – Hybridzz

+0

Warum müssen Sie innerhalb des Threads wissen? Im Moment, in dem der Thread abgebrochen wird, ruft er den Complete Callback mit Status == PXLongRunStatus.Aborted auf. Der Graph-Kontext wird in PXGraph angegeben, Sie können ihn vom generischen Typ in den von Ihnen verwendeten Graph-Typ umwandeln. –

+0

Ich habe ein Fehlerbehandlungsbeispiel hinzugefügt, da dies ein häufiges Szenario für die Abfrage des Ergebnisses einer lang andauernden Operation ist. –

1

Der Delegat wird von einem separaten Thread aufgerufen, der abgebrochen wird, wenn der lange Vorgang abgebrochen wird.

+0

Sie meinen, Framework ruft Thread.Abort-Methode (https://msdn.microsoft.com/en-us/library/5b50fdsz(v=vs.110).aspx) auf, die eine ThreadAbortException im Thread auslöst? – Hybridzz

+0

Genau und die Ausnahme wird verschluckt. Die API für diese Operation ist öffentlich verfügbar über: PXLongOperation.AsyncAbort (MyGraph.UID) –

Verwandte Themen