考虑下一个代码。它是临时的一次性解决方案(很多逻辑被跳过,代码本身被简化),但在我写这篇文章时,我提出了几个问题。
它从uri检索文件,如果从文件夹' j'检索时出现错误,则会停止尝试从该文件夹中进一步检索。
据我所知,这段代码不是线程安全的?虽然看起来它对我来说很好,但出于好奇和自我教育(因为我对多线程的经验不多),我想一劳永逸地想出来:
@font-face {
font-family: Roman;
src: url(/Delicious-Roman-R.otf);
font-style: normal;
font-weight: normal;
}
@font-face {
font-family: Roman;
src: url(/Delicious-Roman-B.otf);
font-style: normal;
font-weight: bold;
}
和openedConnections
(实际上还存在failed
个)变量是否受到数据竞争威胁?Remove
等等?lock
处理程序添加到多个事件中是否很好?DownloadDataCompleted
作为某个专用课程的非静态成员并撰写DownloadDataCompleted
有什么好处?webClient.DownloadDataCompleted += new Dedicated().DownloadDataCompleted;
答案 0 :(得分:1)
当然。
lock()
每次访问前都会列出自己的列表(Add
和Remove
)。
我真的不明白这个问题。是否可以为不同的事件使用相同的处理程序?当然谁在乎,这只是代码。这个特定的处理程序好吗?不是真的,也不是整个架构,直到TCP级别。这不是Windows设计用于TCP连接的方式。
如果您通过代码行获得报酬,那么肯定。这就是企业应用程序的编写方式。如果通过内存或CPU周期浪费而获得报酬,那就更好了。
概念,编写网络抓取工具的传统方式是生成许多线程(数字由您的系统定义,它可以处理多少个连接),推送您的下载网址进入一个数组(不要忘记lock
),并在处理程序内部从数组中弹出一个URL(同样不要忘记lock
)并同步下载它。当你没有物品时,只需返回(或者如果你动态添加物品,等到你得到更多)。