可以在受约束的执行区域中运行的代码可能不会
- 使用显式分配
- 使用拳击
- 获取锁
- 虚拟调用未准备好的方法
- 调用具有弱或不存在可靠性契约的方法。
(取自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
orbox
指令,所以我认为我应该是安全的。
我现在的问题/问题是:
- 由于
Task.Run
没有ReliabilityContract
定义,这是否意味着代码不能在受约束的执行区域中执行? - 是否
Task.Run
或await
以某种方式创建新对象(因此使用显式分配)或获取锁? - 可以
await
在受约束的执行区域中使用吗?