2016-05-16 3 views
1

У меня есть много методов асинхронизации в моем серверном коде, но я подозреваю, что у меня есть абоненты без ожидания.Найти отсутствующий ожидание в решении

Есть ли простой способ сканирования кода для вызовов, где не хватает ожиданий?

public async Task DomeSomethingAsync() 
{ 
    var result = await GetResult(); 
    await StoreResult(result); 
} 

то где-то я забыл использовать ожидание;

public async Task SomeBuggyCode() 
{ 
    await Initialize(); 
    DoSomethingAsync(); // DOH - Forgot await 
} 

Я надеялся, что существует разумный способ идентифицировать эти ошибочные звонки.

+0

@Frode: конкретно требуется Roslyn? или любой разумный способ найти их в порядке? Если вам не нужен Roslyn, пожалуйста, удалите это из вопроса, чтобы было ясно, что ответы, подобные Charles, хороши – quetzalcoatl

+0

Полезно знать. При использовании resharper в течение длительного времени вы начинаете испортить то, что делается им, а что нет :) – Evk

ответ

6

Это должно быть показано, как предупреждения компилятора CS4014 с текстом:

Поскольку этот вызов не ожидал, выполнение текущего метода продолжается до завершения звонка. Рассмотрите возможность применения оператора «ожидание» к результату вызова.

См the documentation

Так все, что вам нужно нужно сделать, это скомпилировать код. VS должен позволить вам перейти в соответствующие местоположения из своего списка ошибок.

+1

Это, безусловно, лучший способ. Причина, по которой я не получал этого предупреждения, состоял в том, что у меня были функции, которые возвращали Task, но не были async. Я почему-то вернул Task.CompletedTask. Теперь они стали асинхронными. – Frode

1

Если метод не содержит даже одного ожидания, вы можете проверить окно вывода. После компиляции вы найдете This async method lacks 'await' operators and will run synchronously ... предупреждение. Дважды щелкните это предупреждение, чтобы перейти к соответствующему методу.

2

Самый простой способ найти их - это просто скомпилировать код.

Любая функция, которая имеет асинхронный режим, но не ждет внутри нее, вызовет compiler warning CS4014, как только вы скомпилируете свой проект, просмотрите список предупреждений, и вы увидите все функции, которые вам нужно исправить.

1

Правда, вы получите предупреждение, но если ваше приложение работает, не дожидаясь этих функций, возможно, вы не хотите их ждать, просто назначьте полученную задачу переменной, чтобы отключить предупреждение, о котором говорили вам парни.

Очевидно, это зависит от вас, чтобы решить.