如何在 Dart 中正确实现 ZoneSpecification(fork: ) 处理程序

问题描述 投票:0回答:1

当我尝试为

ZoneSpecification
实现分叉覆盖时,如下所示:

runZoned(
() {
  runZoned(() {
    print('in zone');
  });
},
zoneSpecification: ZoneSpecification(
  fork: (self, parent, zone, specification, zoneValues) {
    print('forked!');
    return zone.fork(specification: specification, zoneValues: zoneValues);
  },
),

);

我只明白这个:

分叉了! (x7990)
分叉!
未处理的异常:
堆栈溢出
#0 _print (dart:_builtin:29:1)
...
#7993 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)

在代码中我读到只有 RootZone 包含输入区域,所以我不知道如何完成任务。

dart asynchronous async-await
1个回答
0
投票

在处理程序

zone.fork
中对
fork
的调用和嵌套的
runZoned
似乎会导致循环并最终导致堆栈溢出。

下面的示例使用 ZoneDelegate

parent
创建分叉并添加一些
zoneValues
只是为了帮助识别区域:

import 'dart:async';

int id = 0;

void main(List<String> args) {
  runZoned(
      () {
        runZoned(
          () {
            print('   -> Now in zone: ${Zone.current[#id]}');
            print('      parent zone: ${Zone.current.parent![#id]}');
          },
          zoneValues: {#id: ++id},
        );
      },
      zoneValues: {#id: ++id},
      zoneSpecification: ZoneSpecification(fork: (
        self,
        parent,
        zone,
        specification,
        zoneValues,
      ) {
        print('Forking zone with id: ${zone[#id]}');
        return parent
            .fork(zone, specification, {#id: (zoneValues![#id] as int) + 100});
      }));
}

控制台输出如下:

$ dart zone_example.dart 
Forking zone with id: 1
   -> Now in zone: 102
      parent zone: 1
© www.soinside.com 2019 - 2024. All rights reserved.