PowerApps 中的事件处理和线程安全

Event Handling and Thread Safety in PowerApps

除了用户事件之外,Powerapps 还支持计时器事件。这引入了并发计时器访问全局变量或集合的可能性。文档没有提供有关事件处理的信息(并发与顺序、消息泵与回调)。 Powerapps 社区论坛一片寂静。我在这里发帖询问 SO 社区是否在重新发明轮子之前已经对此进行了测试。 (SO搜索未发现相关主题,如有欢迎指正)

示例用例是使用计时器分离和支持条形码注册和数据传输。 IE。想象一家杂货店结账。

如果没有可用的现有信息,将报告调查结果。

PowerApps 基于 JavaScript 构建,它是单线程 (*),基于回调。每个表达式都作为单个 "unit of execution" 执行,所以如果你有类似的东西:

UpdateContext({ a: 1, b: 2 }); UpdateContext({ c: a + b })

您可以相信 'a' 和 'b' 将一起初始化(不会被中断)。但是,您不能依赖这样一个事实,即第二次 UpdateContext 调用将在可能更改 'a' 或 'b' 的值(例如计时器的 OnTimerEnd 表达式)的任何事情发生之前进行 - 尽管这不太可能这将会发生。

对于定时器的具体例子,如果你有两个用这个表达式:

Set(globalVarA, globalVarA + 1)

有可能(虽然不太可能,尤其是对于这种简单的操作)在调用Set函数的内部实现更新值之前,会为两个定时器计算'globalVarA + 1'的值该变量的(在这种情况下,应用程序将 "lose" 增量之一)。

更可能发生问题的场景是当您调用数据源时(涉及较慢的网络调用)。例如,如果您在两个计时器上使用此表达式:

Set(oldVar1, var1);
Patch(dataSource, record, changes);
Set(var1, oldVar1 + 1)

然后竞争条件发生的可能性增加很多。

希望对您有所帮助!

(*) 目前 JS 工作线程的使用非常有限,因此该应用在技术上不是完全单线程的,但这应该不会影响您编写的表达式。