2014-05-17 6 views
17

According to an article in MSDN Magazine, это самая лучшая практика: «Используйте ConfigureAwait(false), когда сможете». Кроме того, в нем говорится: «Если вы можете использовать ConfigureAwait в какой-то момент в методе, я рекомендую вам использовать его для каждого ожидания в этом методе после этой точки». Stephen Cleary, автор этой статьи, states on his blog, что «В вашей библиотеке ' асинхронных методов используйте ConfigureAwait (false), где возможно [курсив добавлен]».Set ConfigureAwait (false) для всего проекта/dll

Учитывая, что большинство или все мои await заявления в проекте библиотеки, которая предназначается, чтобы быть широко использованы, должны иметь .ConfigureAwait(false) это можно сделать что-то/изменить настройки, чтобы сделать это так, что поведение по умолчанию ждут в моем проекте/dll не продолжать в захваченном контексте? То есть, чтобы я мог опустить все звонки на .ConfigureAwait(false) и вместо этого добавить .ConfigureAwait( )10 только тогда, когда мне нужен контекст, который нужно сохранить.

ответ

14

Нет, для этого нет возможности. Команда Microsoft рассматривала настройку компилятора или что-то в этом роде, но в итоге отказалась от нее.

Основная причина заключается в том, что довольно сложно определить, как ведет себя код, не зная, как установлен переключатель компилятора.

+5

Это было бы полезно, если бы был атрибут, который мы могли бы применить к классу или функции, которая указала значение по умолчанию ConfigureAwait. –

+0

Может быть хорошо протестировать ConfigAwait (false) в любой тестовой среде. Любой знает, существует ли такая функциональность в любых рамках. –

+1

@AbdulSaboor: В наши дни есть анализаторы кода, которые могут заставить вас всегда использовать 'ConfigureAwait' (либо' true', либо 'false'), чтобы сделать его явным. Я лично их не использую, но я вижу их выгоду, особенно в более крупных командах. –

11

В настоящее время существует сторонняя библиотека, которая поддерживает это. Пакет Nuget ConfigureAwait.Fody позволяет использовать атрибут ConfigureAwait для маркировки класса, сборки или метода, так что все ожидания должны быть .ConfigureAwait(false). project page имеет этот пример использования:

using Fody; 

[ConfigureAwait(false)] 
public class MyAsyncLibrary 
{ 
    public async Task MyMethodAsync() 
    { 
     await Task.Delay(10); 
     await Task.Delay(20); 
    } 

    public async Task AnotherMethodAsync() 
    { 
     await Task.Delay(30); 
    } 
} 

Я не пробовал это сам, но учитывая то, что я знаю о том, как Fody надстроек работу, это, конечно, возможно.

+3

ConfigureAwait.Fody - хорошая идея, но текущая реализация является ошибкой и, кажется, не поддерживается активно –

+0

И из-за этого она получила доступ к nuget. – AgentFire

Смежные вопросы