【发布时间】:2014-12-19 16:08:22
【问题描述】:
例如下面的代码是线程安全的:
ConcurrentQueue<Guid> _queue = new ConcurrentQueue<Guid>();
while(true)
{
for(int y = 0; y < 3; y++)
{
if(y % 3 == 0)
{
System.Threading.Tasks.Task.Run(() => _queue.Enqueue(Guid.NewGuid()));
}
else if (y % 3 == 1)
{
Guid x;
System.Threading.Tasks.Task.Run(() => _queue.TryDequeue(out x));
}
else if(y % 3 == 2)
{
System.Threading.Tasks.Task.Run(() =>
{
if (_queue.Any(t => t == testGuid))
{
// Do something
}
});
}
}
编辑:显然标题不够清晰,因此更新了代码示例以包含实际的多线程行为,是的,上面的代码只是多线程行为的示例。
【问题讨论】:
-
线程在哪里?
-
您可能在 asp.net 应用程序中拥有它,并且多个线程将访问它而无需您手动创建它们
-
您的代码中没有多线程,但如果您在多线程环境中,ConcurrentQueue 绝对是一个不错的选择,因为它提供了对队列的安全访问。..
-
@pollirrata,当有问题的数据结构在当时和那里创建并且显然其他线程无法访问时,这无关紧要。
-
修改任务中的队列是没有意义的,除非它是一个示例。这些操作花费的时间最短,在后台运行它们没有意义。
标签: c# linq concurrency