原文:https://medium.com/@lelandzach/dart-isolate-2-way-communication-89e75d973f34
该 flutter 允许程序员编写异步代码。这允许 Dart 2.4.0(以及Flutter)执行 HTTP 请求之类的事情,并耐心等待响应,然后继续执行后续代码。
Dart 还允许程序员在单独的线程中异步执行代码!用Isolate类完成此操作。Dart Isolate 在新产生的线程中执行特定功能。第二线程可以与主线程连续通信。
异步 Dart Isolate
Isolate 使用非广播ReceivePort在线程之间传递消息。这样 ReceivePort 只能被监听一次。
ReceivePort 用于侦听消息,而 SendPort 用于发送消息。
Dart 线程代码示例
为了使 Isolates 异步线程,您需要导入 2 个 Dart 库。
import 'dart:async';
import 'dart:isolate';
复制代码
接下来,我们将创建一个用于初始化 Isolates 的函数。该函数监听 Isolates 发送到主线程的消息。最后,该函数返回一个 SendPort,因此主线程可以在需要时将数据发送到 Isolates。
Future<SendPort> initIsolate() async {
Completer completer = new Completer<SendPort>();
ReceivePort isolateToMainStream = ReceivePort();
isolateToMainStream.listen((data) {
if (data is SendPort) {
SendPort mainToIsolateStream = data;
completer.complete(mainToIsolateStream);
} else {
print('[isolateToMainStream] $data');
}
});
Isolate myIsolateInstance = await Isolate.spawn(myIsolate, isolateToMainStream.sendPort);
return completer.future;
}
复制代码
下面的函数将在 Isolate 的新线程中执行。我们将此函数的引用与 SendPort 一起传递给 Isolate 对象的spawn方法。SendPort 被传递,以便新线程可以将消息发送到主线程。
void myIsolate(SendPort isolateToMainStream) {
ReceivePort mainToIsolateStream = ReceivePort();
isolateToMainStream.send(mainToIsolateStream.sendPort);
mainToIsolateStream.listen((data) {
print('[mainToIsolateStream] $data');
});
isolateToMainStream.send('This is from myIsolate()');
}
复制代码
这样就可以在 Dart / Flutter 主线程和 Isolate 线程之间进行连续的双向通信。
接下来,我们将创建 Main。这使我们的 Dart 程序设置了具有双向消息传递功能的第二个线程。
void main() async {
SendPort mainToIsolateStream = await initIsolate();
mainToIsolateStream.send('This is from main()');
}
复制代码
让我们将整个程序放在一起,并添加一个退出调用,这样程序就不会无限挂起。
// Example of bi-directional communication between a main thread and isolate.
import 'dart:io'; // for exit();
import 'dart:async';
import 'dart:isolate';
Future<SendPort> initIsolate() async {
Completer completer = new Completer<SendPort>();
ReceivePort isolateToMainStream = ReceivePort();
isolateToMainStream.listen((data) {
if (data is SendPort) {
SendPort mainToIsolateStream = data;
completer.complete(mainToIsolateStream);
} else {
print('[isolateToMainStream] $data');
}
});
Isolate myIsolateInstance = await Isolate.spawn(myIsolate, isolateToMainStream.sendPort);
return completer.future;
}
void myIsolate(SendPort isolateToMainStream) {
ReceivePort mainToIsolateStream = ReceivePort();
isolateToMainStream.send(mainToIsolateStream.sendPort);
mainToIsolateStream.listen((data) {
print('[mainToIsolateStream] $data');
exit(0);
});
isolateToMainStream.send('This is from myIsolate()');
}
void main() async {
SendPort mainToIsolateStream = await initIsolate();
mainToIsolateStream.send('This is from main()');
}
复制代码
您将在系统输出中看到打印输出
从 main 传递到 Isolate 的消息,反之亦然。
$ dart isolate-example.dart
[isolateToMainStream] This is from myIsolate()
[mainToIsolateStream] This is from main()
复制代码
现在,您可以创建多个 Dart 线程,并使用流在它们之间传递消息!
------------------------------------------------------------------------------
如有疑问,联系 qq:120022950
评论