标签: parallel.foreach

在Parallel.ForEach中使用KeyValuePair <String,String>

我想使用Parallel.For或Parallel运行此常规循环 Parallel.ForEach<>

foreach (KeyValuePair<String, String> symbol in symbolsConfigured){..}
Run Code Online (Sandbox Code Playgroud)

我一直在这样的其他地方使用-

Parallel.ForEach(sig.Products, dbp =>
            {...}
Run Code Online (Sandbox Code Playgroud)

但我想不出该如何写。

c# parallel.foreach

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

这个'do​​uble + ='线程安全吗?

这行代码正在Parallel.For(... row => {code})中执行;

mechanismScores[row] += cellValue;
Run Code Online (Sandbox Code Playgroud)

数组值和cellValue都是double类型.这个线程是安全的还是我需要做...

Interlocked.CompareExchange(ref mechanismScores[row], 
    mechanismScores[row] + cellValue, mechanismScores[row]);
Run Code Online (Sandbox Code Playgroud)

或其他解决方案?

c# parallel.foreach

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

如何使用Parallel.ForEach来显示IDictionary的值?

我是C#爱好者,我正在使用Parallel.ForEach方法.我试图使用以下代码在给定系统上显示环境变量:

IDictionary vars = Environment.GetEnvironmentVariables();

Parallel.ForEach(vars, (envVar) =>
{
   Console.WriteLine("{0} = {1}", envVar.Key, envVar.Value);
});
Run Code Online (Sandbox Code Playgroud)

但是我最终得到了这个错误:

错误3方法'System.Threading.Tasks.Parallel.ForEach <TSource>的类型参数(System.Collections.Concurrent.OrderablePartitioner <TSource>,System.Action <TSource,System.Threading.Tasks.ParallelLoopState,long>)'无法从使用中推断出来.尝试显式指定类型参数.

我很确定我错过了一个演员阵容,但无论我尝试过什么,都无法让它发挥作用.你能帮我吗?

c# parallel.foreach

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

如何指定Parallel.ForEach中执行的并行任务数?

我有~500个任务,每个任务需要约5秒,大部分时间浪费在等待远程资源回复上.我想定义应该自己生成的线程数(经过一些测试)并在这些线程上运行任务.当一个任务完成时,我想在可用的线程上生成另一个任务.

我发现System.Threading.Tasks最容易实现我想要的,但我认为不可能指定应该并行执行的任务数量.对于我的机器,它总是大约8(四核cpu).是否有可能以某种方式告诉应该并行执行多少任务?如果不是最简单的方法来实现我想要的东西?(我试过线程,但代码要复杂得多).我尝试增加MaxDegreeOfParallelism参数,但它只限制了最大数量,所以这里没有运气......

这是我目前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        private static List<string> _list = new List<string>();
        private static int _toProcess = 0;

        static void Main(string[] args)
        {   
            for (int i = 0; i < 1000; ++i)
            {
                _list.Add("parameter" + i);
            }

            var w = new Worker();
            var w2 = new StringAnalyzer();

            Parallel.ForEach(_list, new ParallelOptions() { MaxDegreeOfParallelism = 32 }, item =>
            {
                ++_toProcess;
                string data = …
Run Code Online (Sandbox Code Playgroud)

.net c# parallel-processing parallel.foreach

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

对于小型工作负载,我是否需要检查Parallel.ForEach?

我在工作负载中有一组可以并行运行的项目.有时只有1,有时会有很多.当我在一个大的工作负载上使用Parallel.ForEach时,它明显更快.所以它似乎是Parelle.ForEach的合适用途.

我已经读过,对于1或2的工作负载,最好不要将Parallel.ForEach放在它们上面.这是否意味着我必须用这种模式包装每个可变工作负载大小的Parallel.ForEach?

if (workItems.Count==1)
{
    foreach (MyItem item in workItems)
    {
        bool failed = WorkItWorkIt(item);
    }
}
else
{
    Parallel.ForEach(workItems, (item, loopState) =>
        {
            bool failed = WorkItWorkIt(item);
        });
}
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library parallel.foreach

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

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万
查看次数

在c#中的Parallel.ForEach中的r/w字典条目是否安全?

我有一个字典,我想在foreach循环中修改它的值,但是,因为我的应用程序是时间关键的,我试图避免所有不必要的锁定开销.

var loopData = new Dictionary<int, List<string>>();
var results = new Dictionary<int, List<string>>();

/// loopData and results are both initialized
/// with same set of keys.

Parallel.ForEach(loopData, data =>
    {
        var list = data.Value;
        /// manipulate list here

        /// Is this safe?
        results[data.Key] = list;
    });
Run Code Online (Sandbox Code Playgroud)

标记命令是否安全?即,无需锁定即可读/写字典的不同键值对.

注1:我知道并发集合名称空间及其所有宏观集合.另外我知道我可以简单地lock使用突出显示的命令来确保它的安全性.如前所述,我的目标是尽可能避免不必要的开销.

注2:在此链接中提出了类似的问题.在该问题中,容器的项目在Parallel.ForEach循环内被修改.然而,这里我们没有修改键值对,因此容器是完整的,只有被指向的数据被改变.这使得它与上述问题不同.

更新

  1. 这段代码没有锁定可以正常工作,但我必须确定.
  2. 虽然这ConcurrentDictionary会增加最少的开销,但我想避免它,如果这是安全的.

c# multithreading dictionary concurrentdictionary parallel.foreach

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

立即停止Parallel.ForEach

我在每个循环停止并行时遇到问题.

我正在迭代一组从表中检索到的大约40.000个DataRows,当我在结果集中有100个项目时,我需要立即停止循环.问题是当我在ParallelLoopState上触发Stop方法时,迭代不会立即停止,导致我的结果集不一致(无论是少数项还是多项).

有没有办法确定,一旦我停止,我就会杀死所有线程?

  List<DataRow> rows = new List<DataRow>(dataTable.Select());
  ConcurrentDictionary<string, object> resultSet = new ConcurrentDictionary<string, object>();

  rows.EachParallel(delegate (DataRow row, ParallelLoopState state)
  {
    if (!state.IsStopped)
    {
      using (SqlConnection sqlConnection = new SqlConnection(Global.ConnStr))
      {
        sqlConnection.Open();

        //{
        // Do some processing.......
        //}       

        var sourceKey = "key retrieved from processing";
        if (!resultSet.ContainsKey(sourceKey))
        {
          object myCustomObj = new object();

          resultSet.AddOrUpdate(
          sourceKey,
          myCustomObj,
          (key, oldValue) => myCustomObj);
        }

        if (resultSet.Values.Count == 100)
          state.Stop();
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading parallel.foreach

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

并行用于c#

我正在尝试提高计算图像平均值的方法的性能.

为此,我使用两个For语句来迭代所有图像,因此我尝试使用Parallel For来改进这一点,但结果并不相同.

我做错了吗?或者是什么导致了这种差异?

public static double MeanDN(this GrayImage image)
{
  double mean = 0;
  int totalPixels = image.Width * image.Height;

  for (int i = 0; i < image.Height; i++)
      for (int j = 0; j < image.Width; j++)
          mean += (double)image[i, j] / totalPixels;

  double parallelMean = 0;

  Parallel.For(0, image.Height, i =>
  {
      for (int j = 0; j < image.Width; j++)
          parallelMean += (double)image[i, j] / totalPixels;
  });

  return mean;
}
Run Code Online (Sandbox Code Playgroud)

输出:

mean = 404.12

parallelMean = 148.8658

c# parallel.foreach

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

java 8 parallel stream问题

    _logger.info("data size : "+saleData.size);

    saleData.parallelStream().forEach(data -> {
                SaleAggrData saleAggrData = new SaleAggrData() {
                    {
                        setCatId(data.getCatId());
                        setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
                        setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
                        setUnits(data.getUnits());
                        setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
                        setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
                        setSaleDate(data.getSaleDate());
                        setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
                        setTransactions(data.getTransactions());
                        setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
                    }
                };
                salesAggrData.addSaleAggrData(saleAggrData);
            });
Run Code Online (Sandbox Code Playgroud)

代码的问题是当我从DB获得响应时,并且在使用并行流进行迭代时,每次数据大小都不同,而使用顺序流时,它工作正常.

我不能使用顺序Stream因为数据很大并且需要时间.

任何领导都会有所帮助.

java parallel-processing java-8 parallel.foreach

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