Sobes.tech
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('Սկսել հաշվարկը'),
          ),
        ],
      ),
    );
  }
}