Powerbi PQ-Function.InvokeAfter()-实际延迟

Powerbi PQ-Function.InvokeAfter()-实际延迟,powerbi,powerquery,Powerbi,Powerquery,试图计算函数执行后调用之间的实际延迟 函数应该每秒触发五次 index delay now 0 0 18:47:33 1 0 18:47:33 2 0 18:47:33 3 0 18:47:33 4 0 18:47:33 5 1 18:47:34 6 1 18:47:34 7 1 18:47:34 8 1 18:47:34 9

试图计算函数执行后调用之间的实际延迟

函数应该每秒触发五次

index  delay now
0      0     18:47:33
1      0     18:47:33
2      0     18:47:33
3      0     18:47:33
4      0     18:47:33
5      1     18:47:34
6      1     18:47:34
7      1     18:47:34
8      1     18:47:34
9      1     18:47:34
10     2     18:47:35
11     2     18:47:35
12     2     18:47:35
13     2     18:47:35
14     2     18:47:35
...



但我明白了

real\u delay是此行与上一行之间的差异


代码


代码有什么问题?或者使用InvokeAfter函数???



每秒5次意味着您应该等待(秒/5)=每次调用0.2秒

如果运行此代码:

let
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each 0.2),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(
        ()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))
    ),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay
您将看到该函数每秒被调用5次。


==解决方案==

这是我自己的解决办法。一个令人惊讶的,我想

新代码 最初的想法是多线程解析。由于同时连接有一些限制,我不得不适应

我认为有一个“空零开始”时刻,在该时刻之后调用函数——计算单元的时刻(几乎同时计算所有单元)。第二个参数表示在该起始点之后的延迟。但它似乎累积了所有的延迟。非常奇怪的行为,嗯


所以我解决了问题,但仍然不明白为什么=)

这是您的结果抱歉,无法插入图像。。。无论如何,结果至少是这样strange@Carl你能评论一下吗?对不起,你必须解释一下这种行为有什么奇怪之处,我想我理解发生的一切。此更新的代码在调用时延迟1秒#6、#11等,因此最终结果是80%的调用延迟1秒,20%的调用总时间为1秒,这是有意义的。我希望InvokeAfter异步启动。也就是说,当计数器接收下一个单元格时,它会立即触发JS setTimeout之类的东西,而JS setTimeout在延迟后又会触发内部函数。现在我明白了-下一个细胞只有在上一次治疗后才被治疗。没错,我们没有任何异步函数(但许多值是根据需要延迟计算的)
let
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each 0.2),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(
        ()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))
    ),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay
let
    threads=5,
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each if Number.Mod([Column1], threads)=0 and [Column1]>0 then 1 else 0),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay