Middle+
არის შემთხვევები, როდესაც ვერ შევაჩერებთ კორუტინებს?
sobes.tech AI
პასუხი AI-სგან
ხოლო, არსებობს.
ასეთ შემთხვევების მაგალითები:
- კორუტინა ახორციელებს გრძელმოქმედებს გამოთვლით სამუშაოს რეგულარული შეჩერების შემოწმების გარეშე. კორუტინა მხოლოდ
isActive-ს უყურებს შეჩერების დროს (suspending). თუ სამუშაო არ შეჩერდა (მაგალითად, გრძელი ციკლი ან მათემატიკური გამოთვლები), ის ვერ შეამჩნევს შეჩერების მოთხოვნას. - შეჩერების გამონაკლისების დამუშავება არ ხდება (მაგალითად,
CancellationExceptionარ იჭერება). კორუტინა შეიძლება დასრულდეს, მაგრამ მშობელი კორუტინა ან დავალების მენეჯერი არ იციან მისი შეჩერების შესახებ, და რესურსები შეიძლება არ იყოს სწორად გათავისუფლებული. - არასაკოოპერაციული დისპეჩერები, როგორიცაა
Dispatchers.Unconfinedან დისპეჩერი თხელი ბუშტით, რომელიც არ მხარს უჭერს კოოპერაციულ შეჩერებას. მიუხედავად იმისა, რომCancellationExceptionმაინც გამოიწვევა, ქცევა შეიძლება იყოს გაურკვეველი. - ბლოკირებადი შესვლის/გამოსვლის ოპერაციების გამოყენება, რომლებიც არ არის ჩასმული suspending ფუნქციებში (მაგალითად, კითხვა
InputStream-დან ციკლში,withContext(Dispatchers.IO)და suspending მეთოდების გარეშე). ბლოკირებადი ოპერაცია არ ამოწმებს კორუტინის მდგომარეობას და არ გამოიწვევსCancellationException-ს.
კოოპერაციული შეჩერებისთვის, კორუტინმა უნდა:
- გამოიყენოს დისპეჩერი, რომელიც მხარს უჭერს
Cooperative Cancellation-ს (მაგალითად,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - რეგულარულად შეამოწმოს
isActiveან გამოიყენოს suspending ფუნქციები, რომლებიც ამას აკეთებენ. - სწორად მართოს
CancellationException.