C# 与进度条并行处理一个月的日期

C# 与进度条并行处理一个月的日期,c#,multithreading,asp.net-mvc-3,C#,Multithreading,Asp.net Mvc 3,我正在从事一个ASP.NETMVC3C项目 我已经阅读了ThreadPool.QueueUserWorkItem和Tasks,我认为我需要的应该使用其中一个 public static void ProcessDay(DateTime day) { ... } 假设我想处理从2012-01-01到2012-01-31的天数,所以我必须调用ProcessDay函数31次 如何一次处理5天,并像5个线程中的任何一个一样继续运行更多线程,直到31天结束 非常感谢示例,考虑显示进度条是个好主意:看一看

我正在从事一个ASP.NETMVC3C项目

我已经阅读了ThreadPool.QueueUserWorkItem和Tasks,我认为我需要的应该使用其中一个

public static void ProcessDay(DateTime day) { ... }
假设我想处理从2012-01-01到2012-01-31的天数,所以我必须调用ProcessDay函数31次

如何一次处理5天,并像5个线程中的任何一个一样继续运行更多线程,直到31天结束

非常感谢示例,考虑显示进度条是个好主意:

看一看-例如

DateTime startDate = new DateTime(2012, 01, 01);
var options = new ParallelOptions() { MaxDegreeOfParallelism = 5 };
Parallel.For(0, 30, options, day => { ProcessDay(startDay.AddDays(day)); });
看看——例如

DateTime startDate = new DateTime(2012, 01, 01);
var options = new ParallelOptions() { MaxDegreeOfParallelism = 5 };
Parallel.For(0, 30, options, day => { ProcessDay(startDay.AddDays(day)); });

这方面的简单并行化可以是:-

var dates = Enumerable.Range(1, DateTime.DaysInMonth(year, month)).Select(day => new DateTime(year, month, day));    
Parallel.ForEach(dates, date => { ... });
请注意,如果您有每个线程需要修改的共享状态,那么您必须适当地使用线程同步技术

至于线程的数量,通常最好让Parallel.ForEach自己解决这个问题。它将在内部使用线程池,并将有效地使用所有可用的处理器。您可以通过使用ForEach重载来限制它将使用的线程数,该重载接受将MaxDegreeOfParallelism设置为所需数量的ParallelOptions对象,但您应该运行一些基准测试,看看这样做是否真的可以获得更好的结果

此外,如果这是一个“长时间运行的任务”,您希望显示进度,那么您将无法通过单个web请求实现这一点。网站中的“进度条”概念与桌面应用程序中的“进度条”概念截然不同。在网站中,这通常必须通过轮询来完成。即,发送一个请求,立即启动返回的流程响应,定期轮询可在进度栏或类似栏中显示的进度,然后在完成时显示结果


还有一些框架和技术正在为“推送”类型的通知(如信号器)开发,因此,如果您想对其进行调查,这也可能是一个选项。

这方面的简单并行可以是:-

var dates = Enumerable.Range(1, DateTime.DaysInMonth(year, month)).Select(day => new DateTime(year, month, day));    
Parallel.ForEach(dates, date => { ... });
请注意,如果您有每个线程需要修改的共享状态,那么您必须适当地使用线程同步技术

至于线程的数量,通常最好让Parallel.ForEach自己解决这个问题。它将在内部使用线程池,并将有效地使用所有可用的处理器。您可以通过使用ForEach重载来限制它将使用的线程数,该重载接受将MaxDegreeOfParallelism设置为所需数量的ParallelOptions对象,但您应该运行一些基准测试,看看这样做是否真的可以获得更好的结果

此外,如果这是一个“长时间运行的任务”,您希望显示进度,那么您将无法通过单个web请求实现这一点。网站中的“进度条”概念与桌面应用程序中的“进度条”概念截然不同。在网站中,这通常必须通过轮询来完成。即,发送一个请求,立即启动返回的流程响应,定期轮询可在进度栏或类似栏中显示的进度,然后在完成时显示结果


还有一些用于“推送”类型通知的框架和技术正在开发中,例如signar,因此,如果您想对其进行调查,这也可能是一个选项。

每件事情看起来都很正常,唯一的问题是我无法指示是否所有处理线程都已完成!我知道在web开发中,我需要周期性的请求来显示进度条。我只是不知道如何安全地做到这一点。任何帮助都是非常感谢的:我的意思是,安全地使其成为每个线程完成后必须调整的指示符值。我知道jQuery进度条,以前我很容易使用它。问题是如何用线程安全地创建一些指示符。任何示例代码都像是救命稻草!每件事情看起来都很好,唯一的问题是我无法指示是否所有处理线程都已完成!我知道在web开发中,我需要周期性的请求来显示进度条。我只是不知道如何安全地做到这一点。任何帮助都是非常感谢的:我的意思是,安全地使其成为每个线程完成后必须调整的指示符值。我知道jQuery进度条,以前我很容易使用它。问题是如何用线程安全地创建一些指示符。任何示例代码都像是救命稻草!