Можно ли использовать Task.Run и await в ограниченной области выполнения? - PullRequest
0 голосов
/ 26 апреля 2018

Код, который может быть запущен в ограниченной области выполнения, может не

  • использовать явное распределение
  • использовать бокс
  • получить замок
  • вызовите неподготовленные методы практически
  • вызов методов со слабым или несуществующим договором о надежности.

(взято из 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 использоваться в ограниченной области выполнения?
...