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.