run method
Implementation
Future<TaskResult<T>> run() async {
if (_status != TaskStatus.pending && _status != TaskStatus.queued) {
return _result ?? TaskCancelled<T>('Task already executed');
}
_status = TaskStatus.running;
_startTime = DateTime.now();
_completer = Completer<TaskResult<T>>();
log.info('Task started: $name');
if (timeout != null) {
_timeoutTimer = Timer(timeout!, () {
if (!_completer!.isCompleted) {
_status = TaskStatus.timedOut;
_endTime = DateTime.now();
_result = TaskCancelled<T>('Task timed out after $timeout');
log.error('Task timed out after $timeout');
_completer!.complete(_result!);
}
});
}
try {
final value = await _function((p) {
_progress = p;
return p;
});
if (_cancelRequested) {
_status = TaskStatus.cancelled;
_result = const TaskCancelled();
log.info('Task cancelled');
} else if (!_completer!.isCompleted) {
_status = TaskStatus.completed;
_result = TaskSuccess<T>(value);
log.info('Task completed successfully');
}
} catch (e, st) {
if (!_completer!.isCompleted) {
_status = TaskStatus.failed;
_result = TaskFailure<T>(e, st);
log.error('Task failed: $e');
}
} finally {
_endTime = DateTime.now();
_timeoutTimer?.cancel();
if (!_completer!.isCompleted) {
_completer!.complete(_result!);
}
}
return _result!;
}