C#: Собеседование .NET 2021. Каверзные вопросы: Как завершать Task принудительно? - видео HD

C#: Собеседование .NET 2021. Каверзные вопросы: Как завершать Task принудительно? - видео
00:15:45

12n.ru 16895 роликов

Собеседование .NET 2021. Каверзные вопросы: Как завершать Task принудительно? - видео.

Разбираем вопросы которые задают на собеседованиях. В данном цикле будут разобраны 10 вопросов, собранных в 8-ми коротких видеороликах. В первом видео разбираем как завершить Task в .NET.


Мы в Telegram: t.me/platinum_tech_talks
Чат для общения и вопросов: t.me/platinum_chat
RSS
semen083
04:49
06:40 зачем Вы сделали задержку Task.delay() через getawaiter, если у Вас метод Main является Task? Await Task.Delay() вполне бы отработало.
Vlad
21:21
Тема вообще не раскрыта
1. Task Run гарантировоно запускается в другом потоке (в потоке отличном от того, где Task Run был вызван, обычно запукается для вычистения CPU-bound операций), берется данный поток из пулла потоков, ставит в очередь делегат который мы передали и запускает его.
2. Task Run, кстати говоря сам имеет перегрузку с агрументом CancellationToken и сделано это для того, чтобы отменить задачу кооперативно, то есть перед тем как Task Run будет запускать переданный делегат на пуле потоков, он сам вначале проверит переданный CancellationToken, а именно, не был ли он уже отменен и кинет исключение, если это так, что может сэкономить кучу времени на случай если операция длительная и сложная.

Вот пример:
static async Task Main(string[] args)
{

try
{
var cts = new CancellationTokenSource();
var token = cts.Token;

// отменяем пока еще не выполняется сам делегат
cts.Cancel();

var task = Task.Run(() => ToDoAsync(token));

// если не пробросить token и в Task Run вторым агрументом
// то на этом этапе task.IsCanceled вернет false, хотя задача уже явно
// была отменена давно и в методе ToDoAsync придеться ждать 60 сек
// пока кинется исключение отмены
if (task.IsCanceled)
{
Console.Write(«Canceled»);
}

await task;

}
catch (OperationCanceledException e)
{
Console.WriteLine(e);
}
}

public static async Task ToDoAsync(CancellationToken token)
{
await Task.Delay(60000);
token.ThrowIfCancellationRequested();
}

3. В методе Process в Task.Delay() так же нужно прокинуть token, по той же причине что и выше.