【问题标题】:Event Handling and Thread Safety in PowerAppsPowerApps 中的事件处理和线程安全
【发布时间】:2018-07-03 16:59:11
【问题描述】:

除了用户事件之外,Powerapps 还支持计时器事件。这引入了并发计时器访问全局变量或集合的可能性。文档没有提供有关事件处理的信息(并发与顺序,消息泵与回调)。 Powerapps 社区论坛保持沉默。我在这里发帖询问 SO 社区是否已经在重新发明轮子之前对此进行了测试。 (所以搜索显示没有相关主题,如果有的话,会很高兴地得到纠正)。

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

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

【问题讨论】:

    标签: powerapps


    【解决方案1】:

    PowerApps 建立在 JavaScript 之上,它是基于回调的单线程 (*)。每个表达式都作为一个“执行单元”执行,所以如果你有类似的东西:

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

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

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

    Set(globalVarA, globalVarA + 1)
    

    在调用 Set 函数的内部实现以更新其值之前,可能会为两个计时器计算“globalVarA + 1”的值(尽管不太可能,尤其是对于这种简单的操作)变量(在这种情况下,应用程序将“丢失”其中一个增量)。

    当您调用数据源(涉及速度较慢的网络调用)时,更有可能发生问题。例如,如果你在两个计时器上有这个表达式:

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

    那么发生竞态条件的可能性就会大大增加。

    希望这会有所帮助!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多