Middle
Miks ei saa asünkroonilises meetodis teha pikki arvutusoperatsioone?
sobes.tech AI
Vastus AI-lt
Pikkade arvutustegevuste teostamine asünkroonmeetodis, mis täidetakse peamise isolaatoris (liidese lõng), blokeerib kasutajaliidese. Kuigi asünkroonmeetod kasutab Future või async/await, täidetakse see ikkagi samas lõngas. Kui ressursimahukas ülesanne on käimas, ei saa kasutajaliides uuendada, mis põhjustab rakenduse "jäädumise".
Pikkade operatsioonide tegemiseks ilma kasutajaliidese blokeerimiseta tuleks kasutada:
- Isolaatorid: Eraldi täitmisliinid, mis ei jaga mälu peamise isolaatoriga. Isolaatorite vahel suhtlemine toimub portide (SendPort, ReceivePort) kaudu.
- Compute funktsioon: Mugav kattefunktsioon väikeste arvutuste jaoks isolaatorite loomisel ja haldamisel.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// Funktsioon, mis teostab pikaajalisi arvutusi
int performHeavyComputation(int data) {
// Pikaajaliste arvutuste imitatsioon
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// Kasutades compute funktsiooni, et täita teises isolaatoris
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// Näide StatefulWidgetis
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Pikaajalise arvutuse teostamine teises isolaatoris
computationResult = await heavyComputationInIsolate(10);
setState(() {
// UI uuendamine pärast tulemuse saamist
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Arvutuse tulemus: $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('Alusta arvutusi'),
),
],
),
);
}
}