Acumatica:PXLongOperation意外行为,UI毫无例外地崩溃

问题描述 投票:0回答:2

我进行了繁重的手术,但工作正常(但时间太长):

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

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

public class MPEmployeeTerminationMaint : PXGraph<MPEmployeeTerminationMaint>

这将在这两个选项卡中生成数据网格内容(将生成一些记录):enter image description here建议我使用PXLongOperation

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

操作开始:enter image description here然而,过一会儿它使UI崩溃(或发生了什么):enter image description here但是没有异常。因此,没有异常或其他提示发生了什么。如果更改可编辑属性,则会收到异常:enter image description here“ trace” Acumatica页面为空。

如果我不将this发送到PXLongOperation,则此问题已解决:

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

但是我没有向用户表明长时间操作发生了(显然:没有this,长时间操作和UI之间就不再存在连接了。]

错误定义是什么?

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

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

c# asp.net acumatica
2个回答
0
投票

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

另一件事,您可能希望通过长时间操作来更改引用图形的方式。您不应在长操作的方法内部直接引用this,因为它不允许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); 
     //...
  }

0
投票

我找到了问题的原因。我不明白为什么会发生这种情况,并且这种知识无法解决我的问题,但是,这不再是个谜了:当我们打电话

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

它实际上再次创建了图的实例,并且先前设置的所有属性再次为null。一切都需要重新设置。此方法返回空的可枚举。但是,我仍然不明白为什么图形为空以及为什么没有抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.