C# 嵌套线程及其安全处理
我有一个应用程序,它使用EWS2.0API枚举收件箱文件夹中的文件夹,并将所有附件下载到定义的位置。我在这里提供了一个示例代码,以了解我的代码的外观。我在使用EWS枚举和下载附件时没有问题,相反,问题是由于它在单个线程中运行,所以枚举和下载10-15个附件大约需要20-30分钟。所以我在想: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分钟。所以我在想: 我将使用适合我的情况的多线程或并行任务 首先,我将计算收件箱中的文件夹总数。那么同样的不。 将创建一组线程。现在,在每个文件夹中,我将获得邮件数 如果可能,将再次枚举并打开相同数量的线程, 等等 在线程内完
static main()
{
try{
DownloadAllAttachmentsInsideInbox();
}
catch(Exception ex)
{
// handling
}
}
private void DownloadAllAttachmentsInsideInbox()
{
//core logic goes here
}
我想去这样的地方
最后我想说的是,我不需要任何填鸭式代码,我只需要任何参考工作链接,这样我就可以根据我的使用情况来实现它。不要这样做。将电子邮件下载任务排队到一个线程池中,该线程池通常比可用内核的数量大得多。通过保留一个在启动时创建的电子邮件请求对象池并将其回收到池中以供重复使用,来控制流量
如果不加以控制,线程/任务的数量就会流失。任务并行库是这种情况下的最佳实践,它使您能够更好地控制所创建的
线程。我想在你的发言中指出一点
我将计算收件箱中的文件夹总数。然后将创建相同数量的线程
假设文件夹数为50,并且您正在一台4核处理器机器中创建50个任务
,该机器只能同时运行4个任务
。TPL能够在队列中管理所有这些任务
,并逐个处理。仍然一次创建更多的任务
会有一些开销,这些任务
将在资源方面具有竞争力。您可以根据需求创建任务
,以正确利用资源
System.Environment.ProcessorCount
将帮助您获取机器的内核数,您可以基于此值创建任务。欲了解更多关于第三方物流的信息,请参阅以下链接
使用async
和wait
下载每个文件夹的邮件。了解更多关于
与其下载所有文件夹的邮件,不如只下载用户当时想要的文件夹。e、 g在Outlook中同步的工作方式
例如:在outlook中在添加多个线程之前,您应该确定瓶颈在哪里。所有这些花哨的东西都不会对你有帮助,如果它速度慢的原因是因为你的带宽已经用完了。