ThreadPool中的这个不寻常的代码是什么?

时间:2011-12-15 22:49:47

标签: c# threadpool idioms

我正在使用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#。为什么这样写呢?如果你摆脱了t​​ry / finally并将回归移到了最后,有什么区别?

我理解Reflector是如何工作的,这可能不是原始来源。如果您认为是这种情况,您能否提出原始来源可能是什么?

2 个答案:

答案 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块更有可能执行。有关更多详细信息,请参阅上述书中描述异常和错误处理的部分