可以在受约束的执行区域中运行的代码可能不是
- 使用显式分配
- 使用拳击
- 获得锁定
- 虚拟地调用毫无准备的方法
- 使用弱或不存在的可靠性合同调用方法。
(取自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());
}
}
}
我inspected the IL生成了相关代码中的任何callvirt
,newobj
或box
指令,因此我认为我应该是安全的。
我现在的问题是:
Task.Run
没有定义ReliabilityContract
,这是否意味着代码无法在受约束的执行区域中执行?Task.Run
或await
是否会以某种方式创建新对象(因此使用显式分配)或获取锁定? await
吗?