2017-08-29 8 views
0

私は自分のコードにPXLongOperationを持っていますが、ユーザーが操作をキャンセルしたかどうかを知る方法を見つけることはできません。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

心配はあなたが再度処理を実行しているからユーザーを防止している場合PXLongOperation.GetStatus(Base.UID)== PXLongRunStatus.InProcess – Brendan

+0

スレッド内で操作がキャンセルされているかどうかを知る必要があります。 C#の取り消しトークンのようなオプションはありますか? – Hybridzz

+0

私は、ユーザーがキャンセルをクリックした場合、プロセスを単純に中止する必要があると考えています。ユーザーがキャンセルをクリックするとすぐには表示されないことがありますが、ある時点でキャンセルする必要があります。 – Brendan

答えて

0

PXCustomInfoインターフェイスを使用してPXLongOperationの結果を得ることができます。 SetCustomInfoがコールバックを設定するために使用されるとPXLongRunStatusは、結果が含まれます:コールバック操作のエラー処理のための

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; 
     } 
    } 
} 

コード例:

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

この操作のAPIは、操作がキャンセルされたかどうかをスレッド内で知る必要があります。 C#の取り消しトークンのようなオプションはありますか? – Hybridzz

+0

スレッドの内部を知る必要があるのはなぜですか?スレッドが中断された時点で、status == PXLongRunStatus.AbortedのCompleteコールバックが呼び出されます。グラフのコンテキストはPXGraphのパラメータになります。一般的なタイプから使用している特定のグラフタイプにキャストすることができます。 –

+0

これは、長い実行中の操作の結果を照会する一般的なシナリオであるため、エラー処理の例を追加しました。 –

1

デリゲートは別のスレッドから呼び出され、長い操作がキャンセルされると中止されます。

+0

なので、フレームワークはThread.Abortメソッド(https://msdn.microsoft.com/en-us/library/5b50fdsz(v=vs.110).aspx)を呼び出してスレッド内でThreadAbortExceptionを発生させますか? – Hybridzz

+0

正確に例外が飲み込まれます。 PXLongOperation.AsyncAbort(MyGraph.UID) –

関連する問題