AX 2012 X++ 中的多线程
Multi Threading in AX 2012 X++
我们中的许多人都在经历 AX 2012 中的优化问题。在许多情况下,流程相关代码中的优化问题没有解决方案,就像我们在报告中有许多其他解决方法一样。
案例:我有一个案例,我必须在 AX 2012 中单击一个按钮来执行多个销售订单的确认。在确认该销售订单后,我们需要执行一些其他 'Customized' 过程,在遵循代码实践并最大限度地优化编码方法之后,这是一个有点冗长的过程。所以我对如何通过多线程处理这种情况有疑问
我在Ax2012中使用Thread class了解了使用多线程的特性,然后我尝试通过以下方式实现。
您首先需要在 class 的静态方法中实现所有逻辑。该静态方法应包含 Thread Class 作为参数,例如
public static void process(thread _thread)
{
FG_ConfirmationEngine confirmationEngine = new FG_ConfirmationEngine();
salesTable salesTable;
container _con;;
_con = _thread.getInputParm();
info(conPeek(_thread.getInputParm(),1));
salesTable = salesTable::find(conPeek(_thread.getInputParm(),1));
confirmationEngine.parmSalesTable(salesTable);
confirmationEngine.run();// in this method all of my confirmation pre and post logic exist
}
在 class 中创建该静态方法后,您需要编写该方法的调用。
注意:您不能通过 Thread class 发送任何 Args、Object。您只能通过 thread.setInputParm() 方法以容器形式发送参数,例如 _thread.setInputParm([salestable.salesid]) 方法。
通话中:
salesline salesline;
ExecutePermission perm;
Thread myThread;
ttsBegin;
perm = new ExecutePermission();
if (!perm)
return;
perm.assert();
while select salesid from salestable
where salestable.FG_BookingReferenceID == "BRF-0001"
{
myThread = new Thread();
myThread.setInputParm([salestable.SalesId]);
if (myThread)
{
myThread.removeOnComplete(true);
myThread.run(classnum(FG_ConfirmationEngine), staticMethodStr(FG_ConfirmationEngine,process));
}
}
CodeAccessPermission::revertAssert();
希望对您有所帮助。快乐大兴
不要直接使用multi threading
。是客户端技术。
使用 Axatpa 中的 batch processing
框架。它是在服务器上具有多线程的服务器技术。
https://msdn.microsoft.com/en-us/library/gg243235.aspx
这对开发人员意味着:创建您的 class 并从 RunBasBatch
扩展它(请参阅 AOT 中的 Tutorial_RunBaseBatch
class)或 SysOperation
https://msdn.microsoft.com/en-us/library/gg862488.aspx
Introduction to the SysOperation Framework提供了如何在 AX2012 中并行化代码的具体示例(示例计算质数)。
此外,还有一个名为 Batch Parallelism in AX part I, II, III and IV 的优秀系列帖子,分析了如何将 "threads" 与批处理任务最佳匹配。
我们中的许多人都在经历 AX 2012 中的优化问题。在许多情况下,流程相关代码中的优化问题没有解决方案,就像我们在报告中有许多其他解决方法一样。
案例:我有一个案例,我必须在 AX 2012 中单击一个按钮来执行多个销售订单的确认。在确认该销售订单后,我们需要执行一些其他 'Customized' 过程,在遵循代码实践并最大限度地优化编码方法之后,这是一个有点冗长的过程。所以我对如何通过多线程处理这种情况有疑问
我在Ax2012中使用Thread class了解了使用多线程的特性,然后我尝试通过以下方式实现。
您首先需要在 class 的静态方法中实现所有逻辑。该静态方法应包含 Thread Class 作为参数,例如
public static void process(thread _thread)
{
FG_ConfirmationEngine confirmationEngine = new FG_ConfirmationEngine();
salesTable salesTable;
container _con;;
_con = _thread.getInputParm();
info(conPeek(_thread.getInputParm(),1));
salesTable = salesTable::find(conPeek(_thread.getInputParm(),1));
confirmationEngine.parmSalesTable(salesTable);
confirmationEngine.run();// in this method all of my confirmation pre and post logic exist
}
在 class 中创建该静态方法后,您需要编写该方法的调用。 注意:您不能通过 Thread class 发送任何 Args、Object。您只能通过 thread.setInputParm() 方法以容器形式发送参数,例如 _thread.setInputParm([salestable.salesid]) 方法。
通话中:
salesline salesline;
ExecutePermission perm;
Thread myThread;
ttsBegin;
perm = new ExecutePermission();
if (!perm)
return;
perm.assert();
while select salesid from salestable
where salestable.FG_BookingReferenceID == "BRF-0001"
{
myThread = new Thread();
myThread.setInputParm([salestable.SalesId]);
if (myThread)
{
myThread.removeOnComplete(true);
myThread.run(classnum(FG_ConfirmationEngine), staticMethodStr(FG_ConfirmationEngine,process));
}
}
CodeAccessPermission::revertAssert();
希望对您有所帮助。快乐大兴
不要直接使用multi threading
。是客户端技术。
使用 Axatpa 中的 batch processing
框架。它是在服务器上具有多线程的服务器技术。
https://msdn.microsoft.com/en-us/library/gg243235.aspx
这对开发人员意味着:创建您的 class 并从 RunBasBatch
扩展它(请参阅 AOT 中的 Tutorial_RunBaseBatch
class)或 SysOperation
https://msdn.microsoft.com/en-us/library/gg862488.aspx
Introduction to the SysOperation Framework提供了如何在 AX2012 中并行化代码的具体示例(示例计算质数)。
此外,还有一个名为 Batch Parallelism in AX part I, II, III and IV 的优秀系列帖子,分析了如何将 "threads" 与批处理任务最佳匹配。