我正在使用Reflector来仔细阅读.Net ThreadPool的一些来源,当它显示出来时:
private static bool QueueUserWorkItemHelper(WaitCallback callBack, object state, ref StackCrawlMark stackMark, bool compressStack)
{
bool flag = true;
if (callBack == null)
{
throw new ArgumentNullException("WaitCallback");
}
EnsureVMInitialized();
if (ThreadPoolGlobals.useNewWorkerPool)
{
try
{
return flag;
}
finally
{
QueueUserWorkItemCallback callback = new QueueUserWorkItemCallback(callBack, state, compressStack, ref stackMark);
ThreadPoolGlobals.workQueue.Enqueue(callback, true);
flag = true;
}
}
// code below here removed
}
try / finally块让我觉得非常单一的C#。为什么这样写呢?如果你摆脱了try / finally并将回归移到了最后,有什么区别?
我理解Reflector是如何工作的,这可能不是原始来源。如果您认为是这种情况,您能否提出原始来源可能是什么?
答案 0 :(得分:4)
Microsoft已将源代码发布到.NET - 尽管我仍然使用Reflector,因为它更容易浏览。这是.NET 4.0的实际代码片段。
//
// If we are able to create the workitem, we need to get it in the queue without being interrupted
// by a ThreadAbortException.
//
try { }
finally
{
QueueUserWorkItemCallback tpcallBack = new QueueUserWorkItemCallback(callBack, state, compressStack, ref stackMark);
ThreadPoolGlobals.workQueue.Enqueue(tpcallBack, true);
success = true;
}
答案 1 :(得分:1)
实际上,这个空的try块和finally块模式中的代码在Jeffrey Richter的书“CLR via C#”中有所描述。 问题是,如果出现问题并且线程被中止,则finally块将保证执行。至少他们比try块更有可能执行。有关更多详细信息,请参阅上述书中描述异常和错误处理的部分