Sobes.tech
Middle

Неге асинхрондук ыкмалда узак мөөнөттүү эсептөө операцияларын жүргүзүүгө болбойт?

sobes.tech AI

AIден жооп

Узакандырылган эсептөө операциялары асинхрондуу ыкмада, негизги изоляцияда (UI жипте) аткарылганда, UI блоктолот. Асинхрондуу ыкма Future же async/await колдонсо да, ал ошол эле жипте иштейт. Кыймылдуу ресурстук тапшырма аткарылып жатканда, UI жаңыланбайт, бул колдонмонун "талаа" болуусуна алып келет.

UIни блоктобой узак мөөнөттүү операцияларды аткаруу үчүн төмөнкүлөрдү колдонуу керек:

  • Изоляциялар: Өзүнчө иштөө жиптери, негизги изоляция менен бөлүшпөйт. Изоляциялар арасындагы байланыш порттор (SendPort, ReceivePort) аркылуу жүргүзүлөт.
  • Compute функциясы: Кичинекей эсептөөлөр үчүн изоляциялар түзүү жана башкаруу үчүн ыңгайлуу кутуча.
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 колдонуу
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// StatefulWidgetте колдонуу мисалы
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Башка изоляцияда узак мөөнөттүү эсептөөлөрдү жүргүзүү
    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('Эсептөөнү баштоо'),
          ),
        ],
      ),
    );
  }
}