C#: Собеседование .NET 2021. Каверзные вопросы: Как завершать Task принудительно? - видео HD
00:15:45
Обнаружено блокирование рекламы на сайте
Для существования нашего сайта необходим показ рекламы. Просим отнестись с пониманием и добавить сайт в список исключений вашей программы для блокировки рекламы (AdBlock и другие).
12n.ru 18466 роликов
735 просмотров на сайте 12n.ru
Собеседование .NET 2021. Каверзные вопросы: Как завершать Task принудительно? - видео.
Разбираем вопросы которые задают на собеседованиях. В данном цикле будут разобраны 10 вопросов, собранных в 8-ми коротких видеороликах. В первом видео разбираем как завершить Task в .NET.
Мы в Telegram: t.me/platinum_tech_talks
Чат для общения и вопросов: t.me/platinum_chat
Мы в Telegram: t.me/platinum_tech_talks
Чат для общения и вопросов: t.me/platinum_chat
развернуть свернуть
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, по той же причине что и выше.