Middle
Miért nem lehet hosszú számítási műveleteket végrehajtani aszinkron módszerben?
sobes.tech MI
Válasz az MI-től
Hosszú számítási műveletek az aszinkron módszerben, amelyet a fő izolátumban (UI szál) hajtanak végre, blokkolják a UI-t. Bár az aszinkron módszer Future vagy async/await-et használ, ugyanabban a szálban fut továbbra is. Amíg erőforrás-igényes feladat fut, a UI nem frissülhet, ami az alkalmazás "lefagyásához" vezet.
Hosszú műveletek végrehajtásához anélkül, hogy blokkolnánk a UI-t, a következőket kell használni:
- Izolátumok: Külön végrehajtási szálak, amelyek nem osztják meg a memóriát a fő izoláttal. Az izolátumok közötti kommunikáció portokon (SendPort, ReceivePort) keresztül történik.
- Compute függvény: Egy kényelmes csomag a kis számításokhoz izolátumok létrehozására és kezelésére.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// Funkció, amely hosszú számításokat végez
int performHeavyComputation(int data) {
// Hosszú számítások szimulálása
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// A compute használata más izolátumban való végrehajtáshoz
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// Példa használat StatefulWidget-ben
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Hosszú számítások hívása más izolátumban
computationResult = await heavyComputationInIsolate(10);
setState(() {
// UI frissítése az eredmény megszerzése után
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Számítás eredménye: $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('Számítás indítása'),
),
],
),
);
}
}