@jackroll
Сверхразум

Parallel.ForEach не запускается в новом потоке?

public MainForm()
{
    InitializeComponent();
    this.Text = string.Format("current thread #{0}",
                Thread.CurrentThread.ManagedThreadId);
}

private void button1_Click(object sender, EventArgs e)
{
    ProcessFiles();
}

private void ProcessFiles()
{
    string[] files = Directory.GetFiles(@"F:\Troelsen\asd", "*.jpg", SearchOption.AllDirectories);
    string newDir = @"F:\Troelsen\asd\Modified";
    Directory.CreateDirectory(newDir);
    
    Parallel.ForEach(files, currentFile =>
    {
        //Thread.CurrentThread.Name = "Parallel.ForEach";
        string filename = Path.GetFileName(currentFile);
        using (Bitmap bitmap = new Bitmap(currentFile))
        {
            bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
            if (filename != null) bitmap.Save(Path.Combine(newDir, filename));
        }
        this.Invoke((Action) delegate
        {
            this.Text = string.Format("current thread #{0}",
                Thread.CurrentThread.ManagedThreadId);
        });
    });
}


Нажимаю на button1 и приложение намертво зависает, даже после завершения обработки всех .jpg.

Код взят с книги Andrew Troelsen "Pro C# 5.0 and the .NET 4.5 Framework"
  • Вопрос задан
  • 292 просмотра
Решения вопроса 1
lasalas
@lasalas
.NET Architect
Код
this.Text = string.Format("current thread #{0}",
                Thread.CurrentThread.ManagedThreadId);

всегда будет выполняться в потоке UI (через Invoke() же!)

Правильно:
var text =  string.Format("current thread #{0}", Thread.CurrentThread.ManagedThreadId);
this.Invoke(()=> Text = text);


BTW, Parallel.ForEach() и т.п. вовсе не гарантированно выпоняют операции в отдельных потоках - читайте Рихтера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы