Что это за необычный код в ThreadPool? - PullRequest
3 голосов
/ 16 декабря 2011

Я использовал 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 #. Зачем писать это так? Какая разница, если вы избавились от попытки / наконец и перенесли возврат в конец?

Я понимаю, как работает Reflector и что это может быть не исходный источник. Если вы считаете, что это так, то можете ли вы предположить, каким был первоначальный источник?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

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 голос
/ 12 апреля 2017

На самом деле, этот пустой блок try и код в шаблоне finally описаны в книге Джеффри Рихтера "CLR via C #".Дело в том, что если что-то пойдет не так и поток будет прерван, блоки finally гарантированно выполнятся.По крайней мере, они чаще выполняются, чем пробуют блоки.Более подробную информацию вы можете найти в разделе упомянутой книги, в котором описаны исключения и обработка ошибок

...