在MSDN文章CountdownEvent Class代码示例(下方)中,
什么是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();
}
}
答案 0 :(得分:4)
TryDequeue需要一个类型为T的out参数.T是队列的类型。 local参数将填充您刚刚为队列删除的对象。它可以用于进一步处理。见http://msdn.microsoft.com/en-us/library/dd287208.aspx
答案 1 :(得分:1)
我想这只是因为方法TryDequeue()
有一个int类型的参数,即使你不使用它也必须给它一个。
答案 2 :(得分:1)
来自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()
方法将继续处理。