什么是局部变量(在MSDN代码示例countdowevent类)

本文关键字:countdowevent 代码 MSDN 局部变量 什么 | 更新日期: 2023-09-27 18:01:37

在MSDN文章countdowevent类代码示例(下)中,
local变量是什么?

using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class CDESample
{
    // Demonstrates:
    //      CountdownEvent construction
    //      CountdownEvent.AddCount()
    //      CountdownEvent.Signal()
    //      CountdownEvent.Wait()
    //      CountdownEvent.Wait() w/ cancellation
    //      CountdownEvent.Reset()
    //      CountdownEvent.IsSet
    //      CountdownEvent.InitialCount
    //      CountdownEvent.CurrentCount
    static void Main()
    {
        // Initialize a queue and a CountdownEvent
        ConcurrentQueue<int> queue = new ConcurrentQueue<int>(Enumerable.Range(0, 10000));
        CountdownEvent cde = new CountdownEvent(10000); // initial count = 10000
        // This is the logic for all queue consumers
        Action consumer = () =>
        {
            int local;
            // decrement CDE count once for each element consumed from queue
            while (queue.TryDequeue(out local)) cde.Signal();
        };
        // Now empty the queue with a couple of asynchronous tasks
        Task t1 = Task.Factory.StartNew(consumer);
        Task t2 = Task.Factory.StartNew(consumer);
        // And wait for queue to empty by waiting on cde
        cde.Wait(); // will return when cde count reaches 0
        Console.WriteLine("Done emptying queue.  InitialCount={0}, CurrentCount={1}, IsSet={2}",
            cde.InitialCount, cde.CurrentCount, cde.IsSet);
        // Proper form is to wait for the tasks to complete, even if you that their work
        // is done already.
        Task.WaitAll(t1, t2);
        // Resetting will cause the CountdownEvent to un-set, and resets InitialCount/CurrentCount
        // to the specified value
        cde.Reset(10);
        // AddCount will affect the CurrentCount, but not the InitialCount
        cde.AddCount(2);
        Console.WriteLine("After Reset(10), AddCount(2): InitialCount={0}, CurrentCount={1}, IsSet={2}",
            cde.InitialCount, cde.CurrentCount, cde.IsSet);
        // Now try waiting with cancellation
        CancellationTokenSource cts = new CancellationTokenSource();
        cts.Cancel(); // cancels the CancellationTokenSource
        try
        {
            cde.Wait(cts.Token);
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("cde.Wait(preCanceledToken) threw OCE, as expected");
        }
        // It's good for to release a CountdownEvent when you're done with it.
        cde.Dispose();
    }
}

什么是局部变量(在MSDN代码示例countdowevent类)

TryDequeue需要一个类型为T的out参数。T是您的队列的类型。本地参数将填充您刚刚为队列删除的对象。可用于进一步加工。见http://msdn.microsoft.com/en-us/library/dd287208.aspx

我猜这只是因为方法TryDequeue()有一个int类型的参数,你必须给它一个,即使你不使用它

From ConcurrentQueue<T>.TryDequeue

尝试删除并返回对象的开头并发队列。

public bool TryDequeue(
    out T result
)
Parameters
result
Type: T
When this method returns, if the operation was successful, result contains the object removed. If no object was available to be removed, the value is unspecified.

T是您的队列类型。如果你想知道out做什么,从MSDN查看。

queue.TryDequeue(out local)方法返回true时,cde.Signal()方法将继续处理。