Sobes.tech
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'),
          ),
        ],
      ),
    );
  }
}