线程安全并不是我所担心的一个方面,因为我写的简单应用程序和库通常只在主线程上运行,或者不直接修改任何类中的属性或字段我以前需要担心。关于队列和线程安全的查询
但是,我已开始研究个人项目,我正在使用WebClient
从远程服务器异步下载数据。有一个Queue<Uri>
,它包含一系列下载数据的URI的预建队列。
因此考虑下面的代码片段(这不是我真正的代码,但有些事我希望说明我的问题:
private WebClient webClient = new WebClient();
private Queue<Uri> requestQueue = new Queue<Uri>();
public Boolean DownloadNextASync()
{
if (webClient.IsBusy)
return false;
if (requestQueue.Count == 0)
return false
var uri = requestQueue.Dequeue();
webClient.DownloadDataASync(uri);
return true;
}
如果我理解正确,这种方法不是线程安全的(假设这个特定实例我的推理是webClient
可能会在IsBusy
检查和DownloadDataASync()
方法调用之间的时间内变得繁忙,并且requestQueue
可能在Count
检查和下一个项目出列之间变为空时为
我的问题是处理这种类型的情况以使其线程安全的最佳方式是什么?
这是一个更抽象的问题,因为我认识到对于这种特定的方法,必须有一个非常不方便的时机才能真正引发问题,为了覆盖这种情况,我可以将该方法包装在合适的try-catch
,因为这两件都会抛出异常。但是还有其他选择吗? lock
声明是否适用于此?
您定位的是哪个版本的.Net?如果你有.Net 4.0或4.5,你的实现可能会和2.0不同。 – user7116 2012-08-07 17:38:20
我建议您考虑生产者 - 消费者模式... [链接](http://www.microsoft.com/en-us/download/details.aspx?id=19222) – Darek 2012-08-07 17:40:09
@sixlettervariables我针对C#4.0。 – psubsee2003 2012-08-07 17:45:46