2017-08-29 59 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

我需要知道線程內部操作是否被取消。有沒有像C#中的取消標記的選項。 – Hybridzz

+0

爲什麼你需要知道線程內?此時該線程被中止,它將調用狀態爲PXLongRunStatus.Aborted的完成回調。圖上下文將在PXGraph參數中,您可以將其從通用類型轉換爲您正在使用的特定圖表類型。 –

+0

我添加了一個錯誤處理示例,因爲這是查詢長時間運行結果的常見情況。 –

1

委託從單獨的線程調用,如果長操作被取消,將被中止。

+0

所以你的意思是,框架將調用Thread.Abort方法(https://msdn.microsoft.com/en-us/library/5b50fdsz(v=vs.110).aspx)在線程中引發ThreadAbortException? – Hybridzz

+0

確切地說,這個例外被吞噬了。此操作的API可通過以下方式公開獲得:PXLongOperation.AsyncAbort(MyGraph.UID) –

相關問題