我一直在重写一些流程密集型循环来使用TPL来提高速度.这是我第一次尝试线程,所以想要检查我正在做的是正确的方法.
结果很好 - DataTable从标准foreach循环转换为Parallel.ForEach循环时,处理1000行中的数据已将处理时间从34分钟减少到9分钟.对于此测试,我删除了非线程安全操作,例如将数据写入日志文件并递增计数器.
我仍然需要写回日志文件并增加一个计数器,所以我尝试实现一个包含streamwriter/increment代码块的锁.
FileStream filestream = new FileStream("path_to_file.txt", FileMode.Create);
StreamWriter streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
try
{
object locker = new object();
// Lets assume we have a DataTable containing 1000 rows of data.
DataTable datatable_results;
if (datatable_results.Rows.Count > 0)
{
int row_counter = 0;
Parallel.ForEach(datatable_results.AsEnumerable(), data_row =>
{
// Process data_row as normal.
// When ready to write to log, do so.
lock (locker)
{
row_counter++;
streamwriter.WriteLine("Processing row: {0}", row_counter); …Run Code Online (Sandbox Code Playgroud)