compute< Q, R> function
Spawn an isolate, run callback
on that isolate, passing it message
, and
(eventually) return the value returned by callback
.
This is useful for operations that take longer than a few milliseconds, and
which would therefore risk skipping frames. For tasks that will only take a
few milliseconds, consider scheduleTask
instead.
Q
is the type of the message that kicks off the computation.
R
is the type of the value returned.
The callback
argument must be a top-level function, not a closure or an
instance or static method of a class.
There are limitations on the values that can be sent and received to and
from isolates. These limitations constrain the values of Q
and R
that
are possible. See the discussion at SendPort.send.
The debugLabel
argument can be specified to provide a name to add to the
Timeline. This is useful when profiling an application.
Implementation
Future<R> compute<Q, R>(ComputeCallback<Q, R> callback, Q message, { String debugLabel }) async {
profile(() { debugLabel ??= callback.toString(); });
final Flow flow = Flow.begin();
Timeline.startSync('$debugLabel: start', flow: flow);
final ReceivePort resultPort = ReceivePort();
Timeline.finishSync();
final Isolate isolate = await Isolate.spawn<_IsolateConfiguration<Q, R>>(
_spawn,
_IsolateConfiguration<Q, R>(
callback,
message,
resultPort.sendPort,
debugLabel,
flow.id,
),
errorsAreFatal: true,
onExit: resultPort.sendPort,
);
final R result = await resultPort.first;
Timeline.startSync('$debugLabel: end', flow: Flow.end(flow.id));
resultPort.close();
isolate.kill();
Timeline.finishSync();
return result;
}