Acumatica:PXLongOperation意外行为导致UI崩溃,无一例外 - c#

我的繁重操作正常(但时间太长):

_terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);

在以这种方式定义的图形中:

public class MPEmployeeTerminationMaint : PXGraph<MPEmployeeTerminationMaint>

这将在以下两个选项卡中生成数据网格内容(将生成一些记录):
Acumatica:PXLongOperation意外行为导致UI崩溃,无一例外 - c#
建议使用PXLongOperation

      public async virtual void MPEmployeeTermination_TerminationDate_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
        PXLongOperation.StartOperation(this, () =>
        {
            _terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
        });
    }

操作开始:
Acumatica:PXLongOperation意外行为导致UI崩溃,无一例外 - c#
但是,过一会儿,它会使UI崩溃(或发生了什么):
Acumatica:PXLongOperation意外行为导致UI崩溃,无一例外 - c#
但是没有异常。因此,没有异常或其他提示发生了什么。
如果更改可编辑属性,则会收到异常:
Acumatica:PXLongOperation意外行为导致UI崩溃,无一例外 - c#
“跟踪” Acumatica页面为空。

如果我不发送thisPXLongOperation,则此问题已解决:

  PXLongOperation.StartOperation(Guid.NewGuid(), () =>
        {
            _terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
        });

但是我没有向用户指示长时间操作发生了(很明显:长时间操作和没有this的UI之间没有任何联系)。

错误定义是什么?

我想改善用户体验,并允许他在发生繁重的操作时继续使用UI。如果我可以通过其他方式实现这一目标-也可以。
例如,我可以使用Guid.NewGuid()代替它,但是随后我需要手动刷新UI,并且不保存数据。

我将非常感谢您的任何建议。

参考方案

长期以来,您是否有机会更改Current对象的关键字段? “键”字段是指标记为IsKey的字段。当我尝试修改IsKey值时,以前遇到过类似的行为。另外,请勿将主数据视图的“当前”分配给完全不同的对象,因为这也可能导致相同的问题。

另一件事,您可能想更改从长时间操作中引用图形的方式。您不应在长时间操作的方法中直接引用此方法,因为它不允许Acumatica异步执行代码。
理想情况下,您将创建一个静态方法。我最近在与Acumatica交谈时,他们建议采用以下方法。

   ...
    var graphCopy = this;
    PXLongOperation.StartOperation(this, delegate { 
        //Encapsulating the logic in static method and calling it this
        doMyBusinessLogic(graphCopy); 
    });

}

static void doMyBusinessLogic(MyGraph graph){ 
    //Here VS will throw an exception if references of this graph are used
}       

如果要长时间更新UI,请考虑使用PXCustomInfo。

解决问题的方法是开始从长期运行中注释掉代码,然后重新测试。这将帮助您确定导致该问题的代码。

最后,另一个建议是尝试在进行长时间操作之前调用Save.PressButton(adapter)。如果要在保存之前在新记录上进行长时间操作,则特别需要执行此操作。

 [PXUIField(DisplayName = "Start", MapViewRights = PXCacheRights.Update,
  MapEnableRights = PXCacheRights.Update)]
 [PXProcessButton]
 protected virtual IEnumerable Start(PXAdapter adapter)
 {
     Save.PressButton(adapter); 
     //...
  }

asp.net oledbcommand返回所有行 - c#

我正在使用Oledbconnection连接到Microsoft Access数据库,并且正在使用OleDbCommand检索一些信息。我在数据库中有一个名为retrieveInfo的查询,该查询检索3行数据。字段中有一些重复项,但是应该是这样。我的数据如下所示: Name Email A [email protected] B [email protected] B C@gmai…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

asp.net mvc或javascript将另一页的结果返回给方法 - c#

是否可以将另一个页面的结果返回给JavaScript方法或C#控制器操作?我有一个共享的复杂页面,该页面在我的网站上遍布使用,当前用于在C#后端的用户数据上设置单个变量。当用户完成共享的复杂页面后,我将返回引用页面。当用户在刷新或返回时将其作为url参数传递给返回的页面时,我返回的页面包含新选择的变量。我有一个新页面,我希望从我的共享复杂页面中返回该变量。但…

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …