我进行了繁重的手术,但工作正常(但时间太长):
_terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
在以这种方式定义的图形中:
public class MPEmployeeTerminationMaint : PXGraph<MPEmployeeTerminationMaint>
这将在这两个选项卡中生成数据网格内容(将生成一些记录):建议我使用PXLongOperation
:
public async virtual void MPEmployeeTermination_TerminationDate_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
PXLongOperation.StartOperation(this, () =>
{
_terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
});
}
操作开始:然而,过一会儿它使UI崩溃(或发生了什么):但是没有异常。因此,没有异常或其他提示发生了什么。如果更改可编辑属性,则会收到异常:“ trace” Acumatica页面为空。
如果我不将this
发送到PXLongOperation
,则此问题已解决:
PXLongOperation.StartOperation(Guid.NewGuid(), () =>
{
_terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
});
但是我没有向用户表明长时间操作发生了(显然:没有this
,长时间操作和UI之间就不再存在连接了。]
错误定义是什么?
我想改善用户体验,并允许他在发生繁重的操作时继续使用UI。如果我可以通过其他方式实现这一目标-也可以。例如,我可以使用Guid.NewGuid()代替它,但是随后我需要手动刷新UI,而且数据不会保存。
我将非常感谢您的任何建议。
[在长时间的操作中,您是否有机会更改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);
//...
}
我找到了问题的原因。我不明白为什么会发生这种情况,并且这种知识无法解决我的问题,但是,这不再是个谜了:当我们打电话
PXLongOperation.StartOperation(this, () =>
{
_terminationHandler.InsertOrUpdateEmployeeTerminationDetails(TerminationFilters.Current, EmployeeTerminationItems, EmployeeTerminations.Current);
});
它实际上再次创建了图的实例,并且先前设置的所有属性再次为null。一切都需要重新设置。此方法返回空的可枚举。但是,我仍然不明白为什么图形为空以及为什么没有抛出异常。