Sobes.tech
Junior — Middle

Lehet-e megszakítani az async segítségével indított aszinkron függvény végrehajtását?

sobes.tech MI

Válasz az MI-től

Az aszinkron funkciók, amelyeket az async segítségével indítanak, nem egyszerűen «megszakíthatók» vagy «megállíthatók» kívülről, mivel nem támogatják az erőltetett megszakítást.

Az Androidon (és általában C#-ban) az aszinkron műveletek megszakításának kezelésére a CancellationToken mechanizmusát használják.

Hogyan működik:

  • Egy CancellationToken objektumot adnak át a függvénynek.
  • A függvény belsejében rendszeresen ellenőrzi a token állapotát (például, token.IsCancellationRequested).
  • Ha a megszakítás kérésre kerül, a függvény helyesen zárul be, kivéve egy OperationCanceledException-t vagy egyszerűen visszaad egy eredményt.

Példa:

async Task DoWorkAsync(CancellationToken token)
{
    for(int i = 0; i < 100; i++)
    {
        token.ThrowIfCancellationRequested();
        await Task.Delay(100); // munka szimulálása
    }
}

// Használat
var cts = new CancellationTokenSource();
var task = DoWorkAsync(cts.Token);
// A megszakításhoz:
cts.Cancel();

Így a megszakítás egy kooperatív folyamat, és a függvényt a CancellationToken támogatásával kell írni.