鉴于这个宝石的代码:
class Program
{
private static bool IsAdmin = true;
static void Main(string[] args)
{
if (!IsAdmin)
{
throw new Exception();
}
try
{
var x = 2342342;
var y = 123132;
}
catch (Exception)
{
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果this.IsAdminyield为true,我希望调试器不要输入if语句.实际上它确实 - 并且它超过了投掷,但实际上没有投掷!
现在,这只发生在if语句中有一个异常后跟一个try/catch块,在Visual Studio 2013上,针对.NET Framework 4,64位,"首选32位"未选中.
我已经与不同机器上的同事证实了这种奇怪之处.步骤虽然以下代码和调试器似乎步入if分支,但没有抛出异常:

我处于调试模式,我已经多次尝试编译和清理项目.
任何人都可以解释为什么会这样吗?
我刚读完"Nutshell中的C#4.0"(O'Reilly),我认为这对于愿意转向C#的程序员来说是一本好书,但它让我感到疑惑.我的问题是using声明的定义.根据这本书(第138页),
using (StreamReader reader = File.OpenText("file.txt")) {
...
}
Run Code Online (Sandbox Code Playgroud)
恰好相当于:
StreamReader reader = File.OpenText("file.txt");
try {
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,假设这是真的,并且此代码在单独的线程中执行.此线程现在已中止thread.Abort(),因此ThreadAbortException抛出a并假设线程正好在初始化读取器之后和输入try..finally子句之前.这意味着读者不会被处置!
一种可能的解决方案是以这种方式编码:
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
这将是中止安全的.
现在我的问题:
using声明是不是中止安全还是错误,它的行为与我的第二个解决方案相似?using等同于第一方案(不放弃安全的),为什么它检查null的finally?ThreadAbortException可以在托管代码中的任何位置抛出.但也许有例外,第一个变种毕竟是中止安全的?编辑:我知道使用thread.Abort()不被认为是好习惯.我的兴趣是纯粹的理论:如何在using声明中表现究竟?
我正在为WinForms应用程序编写查询管理器,除其他外,它需要能够在用户输入查询时向用户提供实时搜索结果(想想Google的实时结果,尽管很明显在厚客户端环境而不是Web).由于结果需要在用户输入时开始到达,搜索将变得越来越具体,所以我希望能够在用户输入更具体的信息时仍然执行时取消查询(因为结果会无论如何,只是被丢弃).
如果这是普通的ADO.NET,我显然可以使用该DbCommand.Cancel函数并完成它,但我们使用EF4进行数据访问,并且似乎没有明显的方法来取消查询.另外,在Reflector中打开System.Data.Entity并查看EntityCommand.Cancel显示一个令人沮丧的空方法体,尽管文档声称调用它会将其传递给提供者命令的相应Cancel函数.
我已经考虑过简单地让现有的查询运行并启动一个新的上下文来执行新的搜索(一旦完成就处理现有的查询),但我不喜欢单个客户端有多个开放的想法当我只对最近的结果感兴趣时,运行并行查询的数据库连接.
所有这一切都让我相信,一旦将EF查询分派到数据库中就没有办法取消EF查询,但是我希望这里的某个人能够指出我忽略的东西.
TL/DR版本:是否可以取消当前正在执行的EF4查询?
.Net 中的SpinLock结构可用于管理从多个线程对资源的访问。除了普通锁,它使用忙等待,如果预期等待时间非常短(但消耗更多资源),则速度更快。
其他线程原语,例如 aMonitor和lock(...){}总是获取锁(或永远等待获取它)。但是该SpinLock.Enter方法使用一个ref bool参数来指示获取锁是否失败。
什么是ref bool lockTaken需要的,并在何种情况下可以Monitor.Enter失败(因此设置lockTaken为false?)
在代码审查期间我被建议做
bool acquiredLock = false;
try {
Monitor.TryEnter(lockObject, 500, ref acquiredLock);
if (acquiredLock) {
// do something
}
else {
// fallback strategy
}
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
Run Code Online (Sandbox Code Playgroud)
而不是更简单
if (Monitor.TryEnter(lockObject, 500)) {
try {
// do something...
}
finally {
Monitor.Exit(lockObject);
}
} else {
// fallback strategy
}
Run Code Online (Sandbox Code Playgroud)
它有什么不同?第一个代码怎么能没有出现第二个代码会出现错误的错误?