Parallel.ForEach в c # 4 - PullRequest
       9

Parallel.ForEach в c # 4

0 голосов
/ 19 ноября 2011

Почему этот код не работает? Пожалуйста, покажи мне правильный путь.

 private void BtnStartClick(object sender, EventArgs e)
    {
        var files = Directory.GetFiles(@"D:\pic", "*.png");
        const string newDir = @"D:\pic\NewDir";
        Directory.CreateDirectory(newDir);
        Parallel.ForEach(files, currentFile =>
                                    {
                                        string filename = Path.GetFileName(currentFile);
                                        var bitmap = new Bitmap(currentFile);
                                        bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
                                        if (filename == null) return;
                                        bitmap.Save(Path.Combine(newDir, filename));
                                        AddItemToListBox(string.Format("Processing {0} ", filename));
                                    }
            );
    }

    private void AddItemToListBox(string item)
    {
        if (listBox1.InvokeRequired)
        {
            listBox1.Invoke(new StringDelegate(AddItemToListBox), item);
        }
        else
        {
            listBox1.Items.Add(item);
        }
    }

1 Ответ

2 голосов
/ 19 ноября 2011

Похоже, проблема с Invoke.Попробуйте решение из Проблема с Invoke для распараллеливания foreach

Чтобы избежать блокировки потока пользовательского интерфейса, вам нужно обернуть Parallel.ForEach в Task:

private TaskScheduler ui;

private void BtnStartClick(object sender, EventArgs e)
{
    ui = TaskScheduler.FromCurrentSynchronizationContext();

    Task.Factory.StartNew(pforeach)
      .ContinueWith(task =>
      {
          task.Wait(); // Ensure errors are propogated to the UI thread.
      }, ui);
}

private void ForEachFunction()
{
    var files = Directory.GetFiles(@"D:\pic", "*.png");
    const string newDir = @"D:\pic\NewDir";
    Directory.CreateDirectory(newDir);
    Parallel.ForEach(files, 
        currentFile =>
        {     
             string filename = Path.GetFileName(currentFile);
             var bitmap = new Bitmap(currentFile);

             bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
             if (filename == null) return;

             bitmap.Save(Path.Combine(newDir, filename));

             Task.Factory.StartNew(
                 () => AddItemToListBox(string.Format("Processing {0} ", filename)),
                 CancellationToken.None,
                 TaskCreationOptions.None,
                 ui).Wait();
        });
}

private void AddItemToListBox(string item)
{
    listBox1.Items.Add(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...