C# C#  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Сложный  · 

Отмена и координация задач

Посвящён отмене, таймаутам и координации множества задач. Сценарии охватывают передачу CancellationToken, WhenAll, ограниченный fan-out, частичные ошибки и разницу между прекращением ожидания и остановкой самой операции.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 25
Что делает CancellationToken сам по себе?
Вопрос 2 из 25
Как корректно проверить токен в CPU-цикле?
C#
for (var i = 0; i < items.Length; i++)
{
    if ((i & 1023) == 0) token.ThrowIfCancellationRequested();
    Process(items[i]);
}
Вопрос 3 из 25
Почему токен нужно передать в ReadAsync?
C#
var read = await stream.ReadAsync(buffer, token);
Вопрос 4 из 25
Кто должен Dispose-ить CancellationTokenSource?
Вопрос 5 из 25
Как безопасно выполнить короткий callback при отмене?
C#
using var registration = token.Register(() => socket.Dispose());
await ReceiveUntilClosedAsync();
Вопрос 6 из 25
Что вернёт Task.WhenAll для Task<int>[]?
Вопрос 7 из 25
Запущены ли операции конкурентно в этом примере?
C#
var a = LoadAAsync(token);
var b = LoadBAsync(token);
await Task.WhenAll(a, b);
Вопрос 8 из 25
Что произойдёт с итоговой задачей Task.WhenAll, если одна из входных задач завершилась ошибкой?
Вопрос 9 из 25
Какой результат у await Task.WhenAll(Array.Empty<Task>())?
C#
await Task.WhenAll(Array.Empty<Task>());
Console.WriteLine("done");
Вопрос 10 из 25
Как ограничить 10 одновременных вызовов для тысячи элементов?
C#
await Parallel.ForEachAsync(ids,
    new ParallelOptions { MaxDegreeOfParallelism = 10, CancellationToken = token },
    async (id, ct) => await client.LoadAsync(id, ct));
Вопрос 11 из 25
Что делает cts.CancelAfter(TimeSpan.FromSeconds(2))?
C#
using var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(2));
await WorkAsync(cts.Token);
Вопрос 12 из 25
Чем WaitAsync(timeout) отличается от передачи токена самой операции?
Вопрос 13 из 25
Как различить таймаут сервиса и отмену пользователем?
C#
using var timeout = new CancellationTokenSource(limit);
using var linked = CancellationTokenSource.CreateLinkedTokenSource(
    requestToken, timeout.Token);
try { await CallAsync(linked.Token); }
catch (OperationCanceledException) when (timeout.IsCancellationRequested && !requestToken.IsCancellationRequested)
{ throw new TimeoutException(); }
Вопрос 14 из 25
Почему одинаковый 30-секундный таймаут на каждом из трёх последовательных вызовов нарушает общий SLA 30 секунд?
Вопрос 15 из 25
Что сделать с задачей, проигравшей Task.WhenAny delay?
C#
var operation = RunAsync(cts.Token);
if (await Task.WhenAny(operation, Task.Delay(timeout)) != operation)
{
    cts.Cancel();
    try { await operation; } catch (OperationCanceledException) { }
    throw new TimeoutException();
}
Вопрос 16 из 25
Когда разумен результат ItemResult<T> вместо исключения всего batch?
Вопрос 17 из 25
Почему catch { return null; } опасен в fan-out?
C#
async Task<Customer?> LoadSafe(Guid id)
{
    try
    {
        return await client.LoadAsync(id);
    }
    catch
    {
        return null;
    }
}
Вопрос 18 из 25
Когда retry POST может создать дубль?
Вопрос 19 из 25
Что требуется для all-or-nothing между независимыми внешними сервисами без общей транзакции?
Вопрос 20 из 25
Как собрать исход каждой задачи без прерывания обработки первой ошибкой?
C#
async Task<Result<T>> Capture<T>(Func<Task<T>> call)
{
    try { return Result.Success(await call()); }
    catch (Exception ex) { return Result.Failure<T>(ex); }
}
var results = await Task.WhenAll(calls.Select(Capture));
Вопрос 21 из 25
Как детерминированно проверить отмену операции?
C#
var entered = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var dependency = new FakeDependency(entered);
var task = sut.RunAsync(cts.Token);
await entered.Task;
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => task);
Вопрос 22 из 25
Что полезно измерять у fan-out?
Вопрос 23 из 25
Как проверить общий deadline без ожидания реального времени?
C#
var time = new FakeTimeProvider();
var task = sut.RunAsync(time, token);
time.Advance(TimeSpan.FromSeconds(30));
await Assert.ThrowsAsync<TimeoutException>(() => task);
Вопрос 24 из 25
Почему отмену клиента и внутренний таймаут стоит размечать разными метками?
Вопрос 25 из 25
Как убедиться, что после таймаута фоновой работы не осталось?
C#
await Assert.ThrowsAsync<TimeoutException>(() => sut.FetchAsync());
await fake.WaitUntilIdleAsync();
Assert.Equal(0, fake.ActiveCalls);

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу