2014-05-05 3 views
5

Итак, у меня есть следующий код:DebuggerNonUserCode не работает с асинхронным/ждут

static void Main(string[] args) 
{ 
    var test1 = GeneratedHelperSync(); 
    var test2 = GeneratedHelperAsync().Result; 
} 

[System.Diagnostics.DebuggerNonUserCode] 
static int GeneratedHelperSync() 
{ 
    return RealCode(); 
} 

[System.Diagnostics.DebuggerNonUserCode] 
async static Task<int> GeneratedHelperAsync() 
{ 
    // F11 steps in here! 
    return await Task.FromResult(RealCode()); 
} 

private static int RealCode() 
{ 
    return 1; 
} 

И я F11 (шаг в) через все операторы в Visual Studio 2013. я бы ожидать, что в обоих звонки из Main(), чтобы перевести меня в оператор «return 1». Однако во втором случае он вводит меня в функцию async.

Кажется, что компилятор стирает мой DebuggerNonUserCode во время генерации асинхронного кода.
Мой вопрос: почему он это делает? Я что-то упускаю?

Что касается того, почему я хочу этого, у меня есть некоторые вспомогательные функции асинхронного программирования, которые автоматически генерируются, и я хочу, чтобы они не вступали в них все время.

ответ

3

Это обычная проблема с шаблоном async/await. Это происходит со всеми атрибутами, добавленными к методу async (у меня это случилось с ExcludeFromCodeCoverageAttribute и немного его исследовало).

Что происходит, что компилятор разбивает метод вверх на await и ставит все «после await» в новый метод, который вызывается, когда заканчивается задание await «под ред. Этот новый метод не получает атрибуты из исходного метода - почему я не знаю.

Единственный способ, которым я знаю, работает для ExcludeFromCodeCoverageAttribute, устанавливает атрибут на уровне класса.

+0

Да, эта же проблема преследует связанные атрибуты ContextBoundObject с async/await: http://stackoverflow.com/q/22392997/495262 –

+0

Кто-нибудь знает, почему сгенерированный метод не наследует атрибуты от исходного метода? – ChrFin

+0

Кажется, что есть другие с той же проблемой, только другой атрибут! Установка атрибута в класс не решила проблему :( – dimio

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