Middle
Чаро дар усулҳои асинхронӣ дар иҷрои корҳои ҳисоббарорӣ дароз намешавад?
sobes.tech AI
Ҷавоб аз AI
Дарозмуддат ҳисоблаш амаллари дар асинхрон усулда асосий изолятида (UI тўрида) бажарилганда UIни блоклайди. Ҳатто Future ёки async/awaitдан фойдаланган ҳолда ҳам, у ҳамон шу ўша тўрида ишлайди. Манбааларга бўлган талаб юқори бўлган вазифа бажарилганда, UI янгиланмайди, бу дастурнинг "таркиб" қилишига олиб келади.
UIни блокламасдан узоқ вақт талаб қилувчи амалларни бажариш учун қуйидагиларни ишлатиш керак:
- Изолятлар: Асосий изоляти билан бўлишмайдиган алоҳида ижро тўри. Изолятлар орасидаги алоқа портлар (SendPort, ReceivePort) орқали амалга оширилади.
- Compute функцияси: Кичик ҳисоблашлар учун изолятлар яратиш ва бошқариш учун қулай қоплам.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// Узоқ вақт талаб қилувчи ҳисоблашларни бажарадиган функция
int performHeavyComputation(int data) {
// Узоқ вақт талаб қилувчи ҳисоблашларни имитация қилиш
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// compute ёрдамида бошқа изолатда бажариш
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// StatefulWidgetда мисол
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Узоқ вақт талаб қилувчи ҳисоблашларни бошқа изолатда чақириш
computationResult = await heavyComputationInIsolate(10);
setState(() {
// Натийжани олишдан кейин UIни янгилаш
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Ҳисоблаш натижаси: $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('Ҳисоблашни бошлаш'),
),
],
),
);
}
}