Код, который может быть запущен в ограниченной области выполнения, может не
- использовать явное распределение
- использовать бокс
- получить замок
- вызовите неподготовленные методы практически
- вызов методов со слабым или несуществующим договором о надежности.
(взято из MSDN , выделено мое).
Код, который я хочу выполнить в ограниченном исполнении, это
public interface IFoo
{
[ReliabilityContract(Consistency.MayCorruptAppDomain, Cer.MayFail)]
void DoStuff();
}
public class C
{
[ReliabilityContract(Consistency.MayCorruptAppDomain, Cer.MayFail)]
public async void Execute(IFoo foo)
{
RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
await Task.Run(() => foo.DoStuff());
}
}
}
Я проверил сгенерированный IL и не нашел никаких инструкций callvirt
, newobj
или box
в соответствующем коде, поэтому я думаю, что я должен быть в безопасности.
Мои проблемы / вопросы сейчас:
- Поскольку
Task.Run
не имеет определенного ReliabilityContract
, означает ли это, что код не может быть выполнен в ограниченной области выполнения?
- Создает ли
Task.Run
или await
новые объекты (для этого используют явное распределение) или получает блокировки?
- Может ли
await
использоваться в ограниченной области выполнения?