Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套线程及其安全处理_C#_Multithreading_Visual Studio 2010_Visual Studio 2012_Task Parallel Library - Fatal编程技术网

C# 嵌套线程及其安全处理

C# 嵌套线程及其安全处理,c#,multithreading,visual-studio-2010,visual-studio-2012,task-parallel-library,C#,Multithreading,Visual Studio 2010,Visual Studio 2012,Task Parallel Library,我有一个应用程序,它使用EWS2.0API枚举收件箱文件夹中的文件夹,并将所有附件下载到定义的位置。我在这里提供了一个示例代码,以了解我的代码的外观。我在使用EWS枚举和下载附件时没有问题,相反,问题是由于它在单个线程中运行,所以枚举和下载10-15个附件大约需要20-30分钟。所以我在想: 我将使用适合我的情况的多线程或并行任务 首先,我将计算收件箱中的文件夹总数。那么同样的不。 将创建一组线程。现在,在每个文件夹中,我将获得邮件数 如果可能,将再次枚举并打开相同数量的线程, 等等 在线程内完

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

  • 我将使用适合我的情况的多线程或并行任务

  • 首先,我将计算收件箱中的文件夹总数。那么同样的不。 将创建一组线程。现在,在每个文件夹中,我将获得邮件数 如果可能,将再次枚举并打开相同数量的线程, 等等

  • 在线程内完成下载后,将清除该线程 它本身(如果可能的话)将返回到它的父级
  • 现有代码的框架:

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

    我想去这样的地方

  • 主线程->下载AllAttachmentsInSideInbox()
  • 枚举此方法中的所有目录并创建相同数量的线程
  • 为单个文件夹创建单个线程,并枚举该线程中包含附件的邮件数
  • 现在获取电子邮件总数,为每个文件夹中的每个邮件创建线程,并让下载在每个线程中分别开始
  • 应安全地处理所有螺纹


  • 最后我想说的是,我不需要任何填鸭式代码,我只需要任何参考工作链接,这样我就可以根据我的使用情况来实现它。

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


    如果不加以控制,线程/任务的数量就会流失。

    任务并行库是这种情况下的最佳实践,它使您能够更好地控制所创建的
    线程。我想在你的发言中指出一点

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

    假设文件夹数为50,并且您正在一台4核处理器机器中创建50个
    任务
    ,该机器只能同时运行4个
    任务
    。TPL能够在队列中管理所有这些
    任务
    ,并逐个处理。仍然一次创建更多的
    任务
    会有一些开销,这些
    任务
    将在资源方面具有竞争力。您可以根据需求创建
    任务
    ,以正确利用资源

    System.Environment.ProcessorCount
    将帮助您获取机器的内核数,您可以基于此值创建任务。欲了解更多关于第三方物流的信息,请参阅以下链接

    使用
    async
    wait
    下载每个文件夹的邮件。了解更多关于

    与其下载所有文件夹的邮件,不如只下载用户当时想要的文件夹。e、 g在Outlook中同步的工作方式
    例如:在outlook中

    在添加多个线程之前,您应该确定瓶颈在哪里。所有这些花哨的东西都不会对你有帮助,如果它速度慢的原因是因为你的带宽已经用完了。