小编dal*_*mac的帖子

C#Parallel.foreach - 使变量线程安全

我一直在重写一些流程密集型循环来使用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)

c# locking task-parallel-library parallel.foreach

2
推荐指数
1
解决办法
1万
查看次数