繁体   English   中英

可以dispatch_async中断调用任务

[英]Can dispatch_async interrupt calling task

假设我将一个任务异步调度到一个队列:

{
    // we are on main queue

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      print("task B")
    });

    print("task A")

    // some long running work

    print("task A")

    // some long running work

    print("task A")
    ...
}

可以在任何情况下调度任务中断发送它的任务吗? 换句话说,在打印所有“任务A”之前,是否会发生“任务B”的打印?

task A
task B
task A
task A
...

或GCD将保证:

task A
task A
task A
...
task B

如果将任务分派到调用dispatch_async的同一队列,它会有什么不同吗?

换句话说,在打印所有“任务A”之前,是否会发生“任务B”的打印?

绝对可能发生。 如果要异步调度到(a)不同的队列; 或者(b)并发队列(以及全局队列是并发队列),您明确要求它们相互并发运行。

AB日志消息的确切顺序是各种任务的耗时,队列的优先级等等的函数。但是如果你希望B在所有A任务之后才出现,那么你应明确控制该行为(通知发送组,串行队列,障碍等的块)。

如果您告诉我们您想要保证的行为,我们可以告诉您如何做到这一点。

换句话说,在打印所有“任务A”之前,是否会发生“任务B”的打印?

这不是不可能的,我不会说这里的任何事情都有保证 异步意味着你告诉运行时“每当,伙计”(假设你喜欢与运行时交谈)。

如果dispatch_async是相同的队列,因为它是呼吁那队列是串行队列,那么你的最后一个场景保证:我们无法在队列中,直到当前块已完成启动一个新的块。 (但DISPATCH_QUEUE_PRIORITY_DEFAULT 不是串行队列。)

如果你想在所有As之后打印“B”,你可以保证:

// we are on main queue

print("task A")

// some long running work

print("task A")

// some long running work

print("task A")
...

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{
  print("task B")
});

显然这没有任何意义,如果As是长跑者而B是短跑者。

对不起,对我来说,看起来有点你不明白,GCD是为了什么。 也许您想告诉我们,您真正的具体方案是什么以及您希望在该方案​​中完成什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM