标签: parallel.foreach

将在ObjectContext.Add中使用Parallel.ForEach

我正在使用Entity Framework和通用存储库模式.我使用以下方法添加对象.

public int Add<TEntity>(TEntity entity) where TEntity : class
{
   DataContext.AddObject(GetEntityName<TEntity>(), entity);
   return SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我也在考虑扩展它以支持多个实体.

public int Add<TEntity>(TEntity[] collection) where TEntity : class
{
   foreach (TEntity item in collection)
   {
     DataContext.AddObject(GetEntityName<TEntity>(), item);
   }

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

在上述场景中使用Parallel.ForEach而不是foreach循环会有实际好处吗?

另外因为我没有SaveChanges()在循环结束之前调用,如果有让我们说主键违规,它会被抛入循环内部还是SaveChanges()被调用时?我可以回滚更改吗?

entity-framework-4 objectcontext parallel.foreach

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

Parallel.ForEach问题 - 读写文件 - 文件正在使用错误

我真的很困惑Parallel.ForEach ...它是如何工作的?
下面的代码有错误 - >File Is In Use

Parallel.ForEach(list_lines_acc, (line_acc, list_lines_acc_state) =>
{
     FileStream file = 
         new FileStream(GPLfilePath, FileMode.Open, FileAccess.ReadWrite);
     StreamReader reader = new StreamReader(file);
     var processed = string.Empty;
     Ok_ip_port = string.Empty;
     while (reader.EndOfStream)
     {
         if (string.IsNullOrEmpty(Ok_ip_port))
         {
             Ok_ip_port = reader.ReadLine();
         }
         else
         {
             string currentLine = reader.ReadLine();
             processed += currentLine + Environment.NewLine;
         }
     }
     StreamWriter writer = new StreamWriter(file);
     writer.Write(processed);

     reader.Close();
     writer.Close();
     file.Close();
});  
Run Code Online (Sandbox Code Playgroud)

你能告诉我怎样才能解决这个问题?这段代码只是一个例子.

我想在Parallel.ForEach中使用字符串数组和列表,但是添加或编辑这些集合总是存在问题.你能举个例子吗?我使用的是Visual Studio 2010 + .NET Framework 4.0

c# file read-write windows-applications parallel.foreach

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

Parallel.ForEach如何知道哪个项目? - 哪个循环?

  var options = new ParallelOptions()
  {
      MaxDegreeOfParallelism = 10
  };

  List<string> lstAllUrls = File.ReadAllLines("myList.txt").ToList<string>();

  Parallel.ForEach(lstAllUrls, options, myFunctionThatFetchPage);
Run Code Online (Sandbox Code Playgroud)

现在这完全没问题.我想知道的是:我怎么知道我目前在哪个迭代.我的意思是说我的列表有100000个URL.它开始取出它们.但我还想在屏幕上打印当前正在获取URL的内容.

我怎样才能做到这一点?如何判断循环当前在给定列表的哪个项目?

c# parallel.foreach

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

如何通过parallel.foreach知道每个线程产生的threadid

我有一个像这样的场景

int arr[100];

Parallel.Foreach(arr, (a) => { some processing});
Run Code Online (Sandbox Code Playgroud)

现在,这段代码将生成100个子线程,如何在"某些处理"逻辑中知道每个子线程的线程id.

c# parallel.foreach

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

使用 Timer 测量 Parallel.ForEach 进度意外暂停

我是Parallel.ForEach第一次使用,我正在处理文件;在 WinForms 应用程序的上下文中。

根据其他线程对此编码问题(Parallel.ForEach 进度报告)的指导,我的类中有一个 public (int) counter 属性,其中包含并行代码,并且它正在成功更新;我的表单上还有一个 Timer 可以定期读取计数器。

问题是,当我执行并行代码时,可见进度更新似乎停止,然后在并行代码完成后立即开始。

仅供参考 - 我直接调用并行代码 - 也就是说,不是通过后台工作程序或异步方法。

c# timer winforms parallel.foreach

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

并行forEach搜索文件

我有一个包含2个列表框的程序,这个程序是基于搜索文件,然后比较StopWatch使用AsyncAwait和TPL 的区别...第一个列表框使用的功能 AsyncAwait(我不知道它是否更好的方式但它有效,请参阅下面的代码)

private async void button1_Click(object sender, EventArgs e)
{
    Stopwatch stopWatch = new Stopwatch();
    foreach (string d in Directory.GetDirectories(@"C:\Visual Studio Projectes\Hash\AsyncAwait\Carpetes"))
    {    
        foreach (string s in Directory.GetFiles(d))
        {
            stopWatch.Start();
            listBox1.Items.Add(s);
            await Task.Delay(1);
            btIniciar1.Enabled = false;
        }
    }
    btIniciar1.Enabled = true;
    stopWatch.Stop();
    TimeSpan ts = stopWatch.Elapsed;
    textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
}
Run Code Online (Sandbox Code Playgroud)

然后在我的第二个列表框在那里我坚持,我不知道如何实现Parallel.ForEach对像async,有什么更好的方式来做到这一点?在这种情况下我找不到使用TPL的方法和我的第一个列表框一样,你能帮帮我吗?

c# winforms async-await parallel.foreach

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

在Parallel.Foreach中使用ParallelOptions在串行和并行操作之间切换

我们在代码中广泛使用了Parallel.Foreach,我们唯一的挑战是如何在DEBUG模式下使用可视调试使其成为串行,以下是我们正在做的,请分享您的观点:

public static class ParallelOptionsWrapper
{
    // Private instance of ParallelOptions 
    private static readonly ParallelOptions @ParallelOptions;

    // Private constructor
    static ParallelOptionsWrapper()
    {
        @ParallelOptions = new ParallelOptions();

#if DEBUG
        // 1 is sequential
        @ParallelOptions.MaxDegreeOfParallelism = 1;
#else
        // -1 is unlimited
        @ParallelOptions.MaxDegreeOfParallelism = -1;
#endif
    }

    public static ParallelOptions Instance() { return @ParallelOptions; }
}
Run Code Online (Sandbox Code Playgroud)

以下是用法:

Parallel.ForEach(EnumerableList, ParallelOptionsWrapper.Instance(), element =>
{
// Code to run in Parallel
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有Parallel.Foreach调用都具有ParallelOptions的相同实例,在我看来应该没问题.

这样安全吗?这有效吗?

c# parallel-processing multithreading task-parallel-library parallel.foreach

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

ConcurrentQueue和Parallel.ForEach

我有一个ConcurrentQueue,其中包含需要获取其来源的URL列表。当将Parallel.ForEach与ConcurrentQueue对象用作输入参数时,Pop方法将无效(应返回一个字符串)。

我使用MaxDegreeOfParallelism设置为四个的Parallel。我真的需要阻止并发线程的数量。使用具有并行性的队列是否多余?

提前致谢。

// On the main class
var items = await engine.FetchPageWithNumberItems(result);
// Enqueue List of items
itemQueue.EnqueueList(items);
var crawl = Task.Run(() => { engine.CrawlItems(itemQueue); });

// On the Engine class
public void CrawlItems(ItemQueue itemQueue)
{
Parallel.ForEach(
            itemQueue,
            new ParallelOptions {MaxDegreeOfParallelism = 4},
            item =>
            {

                var worker = new Worker();
                // Pop doesn't return anything
                worker.Url = itemQueue.Pop();
                /* Some work */
             });
 }

// Item Queue
class ItemQueue : ConcurrentQueue<string>
    {
        private ConcurrentQueue<string> queue = new ConcurrentQueue<string>(); …
Run Code Online (Sandbox Code Playgroud)

c# parallel.foreach concurrent-queue

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

Parallel.ForEach比正常foreach慢

我在C#控制台应用程序中使用Parallel.ForEach,但似乎无法正确使用它.我正在创建一个包含随机数的数组,我有一个连续的foreach和一个找到数组中最大值的Parallel.ForEach.使用c ++中大致相同的代码,我开始看到在数组中使用3M值的多个线程的权衡.但即使在100M值下,Parallel.ForEach也是两倍慢.我究竟做错了什么?

class Program
{
    static void Main(string[] args)
    {
        dostuff();

    }

    static void dostuff() {
        Console.WriteLine("How large do you want the array to be?");
        int size = int.Parse(Console.ReadLine());

        int[] arr = new int[size];
        Random rand = new Random();
        for (int i = 0; i < size; i++)
        {
            arr[i] = rand.Next(0, int.MaxValue);
        }

        var watchSeq = System.Diagnostics.Stopwatch.StartNew();
        var largestSeq = FindLargestSequentially(arr);
        watchSeq.Stop();
        var elapsedSeq = watchSeq.ElapsedMilliseconds;
        Console.WriteLine("Finished sequential in: " + elapsedSeq + "ms. Largest = " + largestSeq); …
Run Code Online (Sandbox Code Playgroud)

.net c# parallel-processing parallel.foreach

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

Parallel.ForEach是否使用ASP.NET线程池中的线程?

我已经读过在ASP.NET Web应用程序中使用Task.Run是一个坏主意,因为它使用来自线程池的另一个线程,因此阻止这个特定的线程用于提供请求.

Parallel.ForEach的情况不一样吗?它是否会使用线程池中的多个线程,从而阻止这些特定线程用于提供请求?

c# asp.net task-parallel-library async-await parallel.foreach

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