Middle
Ինչու չի կարելի երկարատև հաշվարկային օպերացիաներ կատարել ասինխրոն մեթոդում?
sobes.tech AI
Պատասխան AI-ից
Երկարատև հաշվարկային գործողությունները հիմնական იზոլատում (UI թել) asinhron մեթոդում, որը կատարվում է, խոչընդոտում են UI-ին: Թեև asinhron մեթոդը օգտագործում է Future կամ async/await, այն դեռևս կատարվում է նույն թելում: Երբ կատարվում է ռեսուրսներ պահանջող առաջադրանք, UI-ն չի կարող թարմացվել, ինչը հանգեցնում է ծրագրի «կայթելու»:
Դարաշրջանային գործողությունները առանց UI-ի խոչընդոտելու, պետք է օգտագործել՝
- Իզոլատներ: Անկախ կատարողական թելեր, որոնք չեն բաժանում հիշողությունը հիմնական izolat- ի հետ: Իզոլատների միջև հաղորդակցությունը կատարվում է պորտերով (SendPort, ReceivePort):
- Compute ֆունկցիա: Հարմարավետ պատյան փոքր հաշվարկների համար izolat-ների ստեղծման և կառավարման համար:
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 օգտագործելով՝ այլ izolat- ում կատարելու համար
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// Օրինակ օգտագործում StatefulWidget-ում
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Երկարատև հաշվարկներ այլ izolat- ում
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('Սկսել հաշվարկը'),
),
],
),
);
}
}