c#:使用相同变量的多个事件的单个处理程序:最佳实践

时间:2015-05-29 05:16:46

标签: c# multithreading asynchronous

考虑下一个代码。它是临时的一次性解决方案(很多逻辑被跳过,代码本身被简化),但在我写这篇文章时,我提出了几个问题。

它从uri检索文件,如果从文件夹' j'检索时出现错误,则会停止尝试从该文件夹中进一步检索。

据我所知,这段代码不是线程安全的?虽然看起来它对我来说很好,但出于好奇和自我教育(因为我对多线程的经验不多),我想一劳永逸地想出来:

  1. @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个)变量是否受到数据竞争威胁?
  2. 如果它不是线程安全的,那么使其安全的最佳做法是什么?在哪里添加Remove等等?
  3. 是否有任何不一致,如果这些变量不存在?我的意思是,将lock处理程序添加到多个事件中是否很好?
  4. DownloadDataCompleted作为某个专用课程的非静态成员并撰写DownloadDataCompleted有什么好处?
  5. 总的来说,您的意见:解决此类任务的最佳方法是什么?不考虑小代码优化,但在概念上(或者我必须在概念上写' o_O)
  6. webClient.DownloadDataCompleted += new Dedicated().DownloadDataCompleted;

1 个答案:

答案 0 :(得分:1)

  1. 当然。

  2. lock()每次访问前都会列出自己的列表(AddRemove)。

  3. 我真的不明白这个问题。是否可以为不同的事件使用相同的处理程序?当然谁在乎,这只是代码。这个特定的处理程序好吗?不是真的,也不是整个架构,直到TCP级别。这不是Windows设计用于TCP连接的方式。

  4. 如果您通过代码行获得报酬,那么肯定。这就是企业应用程序的编写方式。如果通过内存或CPU周期浪费而获得报酬,那就更好了。

  5. 概念,编写网络抓取工具的传统方式是生成许多线程(数字由您的系统定义,它可以处理多少个连接),推送您的下载网址进入一个数组(不要忘记lock),并在处理程序内部从数组中弹出一个URL(同样不要忘记lock)并同步下载它。当你没有物品时,只需返回(或者如果你动态添加物品,等到你得到更多)。