嵌套线程并安全地处理它

时间:2014-05-30 18:36:08

标签: c# multithreading visual-studio-2010 visual-studio-2012 task-parallel-library

我有一个应用程序,它使用EWS2.0 API枚举Inbox文件夹中的文件夹,并将所有附件下载到定义的位置。我在这里提供一个示例代码,以了解我的代码是如何形成的。使用EWS枚举和下载附件时没有问题,而问题是由于它在单个线程中运行,因此枚举和下载10-15个附件需要大约20-30分钟。所以我在想:

  1. 我会使用多线程或并行任务,这些都适用于我的情况。

  2. 首先,我将计算收件箱内的文件夹总数。然后同样没有。    将创建线程现在在每个文件夹中,我将获得邮件的数量    要枚举,如果可能,再次打开相同数量的线程,    等等。

  3. 在线程内完成下载后,将清理该线程    在那里(如果可能的话)否则将返回其父母。
  4. 现有代码的骨架:

    static main()
    {
      try{
           DownloadAllAttachmentsInsideInbox();
         }
      catch(Exception ex)
      {
        // handling 
      }
    }
    private void  DownloadAllAttachmentsInsideInbox()
    {
      //core logic goes here
    }
    

    我想要这样的事情。

    1. 主线程 - > DownloadAllAttachmentsInsideInbox()
    2. 枚举此方法中的所有目录并创建相同数量的线程。
    3. 为单个文件夹创建单个线程并枚举否。邮件中包含附件的邮件。
    4. 现在获取每个文件夹中每封邮件的电子邮件总数和创建线程,并在每个帖子中单独开始下载。
    5. 应安全处理所有线程。

    6. 最后我想说,我不需要任何勺子喂食代码,我只需要任何参考工作链接,以便我可以按照我的用法实现它。

2 个答案:

答案 0 :(得分:1)

任务并行库是这种情况下的最佳实践,它可以让您更好地控制自己创建的threads。我想在你的发言中提出一点

  

我会计算收件箱内的文件夹总数。然后将创建相同数量的线程

假设文件夹数为50,并且您在4核处理器计算机中创建了50 Tasks,该计算机只能同时运行4 Tasks。 TPL能够管理队列中的所有Tasks并逐个处理。仍然一次创建更多Tasks会产生一些开销,而这些Tasks将对资源产生竞争力。您可以根据需要创建Task以正确使用资源。

System.Environment.ProcessorCount将帮助您获取您的计算机内核数量,根据此值可以创建任务。要了解有关TPL的更多信息,请参阅以下链接。

http://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx

使用asyncawait下载每个文件夹的邮件。

了解更多信息

http://msdn.microsoft.com/en-us/library/hh191443.aspx

不要下载所有文件夹的邮件,只下载当时用户想要的文件夹。例如同步在Outlook中的工作方式 例如:在展望中

答案 1 :(得分:0)

不要这样做。将电子邮件下载任务排队到线程池,这些线程通常比可用核心数量大得多。通过保留在启动时创建的电子邮件请求对象池并将其循环回池中以便重复使用来控制它。

如果你没有盖上它,线程/任务的数量就会消失。