3

可以在受约束的执行区域中运行的代码可能不会

  • 使用显式分配
  • 使用拳击
  • 获取锁
  • 虚拟调用未准备好的方法
  • 调用具有弱或不存在可靠性契约的方法。

(取自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, newobjorbox指令,所以我认为我应该是安全的。


我现在的问题/问题是:

  • 由于Task.Run没有ReliabilityContract定义,这是否意味着代码不能在受约束的执行区域中执行?
  • 是否Task.Runawait以某种方式创建新对象(因此使用显式分配)或获取锁?
  • 可以await在受约束的执行区域中使用吗?
4

0 回答 0