首先,对于这个困难的问题标题感到抱歉,但我想不出更好的了。如果有人知道更好的描述,我很乐意更改标题!:)
假设我有以下两个类的代码:
using(new Wrapper())
{
Inner.Do();
}
public class Wrapper : IDisposable
{
public static Wrapper Instance { get; set; }
public Wrapper()
{
Instance = this;
}
public void Dispose()
{
Instance = null;
}
}
public static class Inner
{
public static Do()
{
if (Wrapper.Instance == null)
{ /* no using */ }
else
{ /* with using */ }
}
}
上面的代码按预期工作,我能够检测我的代码是否包含在 using 语句中。
不幸的是,静态实例变量是我能想到的实现上述目标的最佳方式,但它肯定不是最好的情况。假设两个线程在“同一”时间执行上述代码。一个线程会覆盖另一个线程的实例,从而导致异常行为和竞争条件。
问题:
任何人都可以指导我找到我仍然能够执行上述操作但不使用静态实例变量的解决方案吗?
提前致谢!
回答
由于这只是对新事物的测试,因此我现在使用 ThreadStaticAttribute。但正如 Marc Gravell 所说,如果正在进行异步操作,请不要使用它。
有关用法,请参阅 Kris Vandermotten 的回答。