У меня есть следующий код, и он отлично работает:
private void BtBasicIntroClick(object sender, EventArgs e)
{
var stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions
{
//TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(),
MaxDegreeOfParallelism = 1
};
var actionBlock = new ActionBlock<int>(s =>
{
//comboBox1.Items.Add((s*3).ToString());
Invoke(new Action(() => comboBox1.Items.Add((s * 3).ToString())));
}, executionDataflowBlockOptions);
var numeros = Enumerable.Range(0, 40000);
foreach (var numero in numeros)
{
actionBlock.Post(numero);
}
Task.Factory.StartNew(() =>
{
actionBlock.Completion.ContinueWith(delegate
{
stopwatch.Stop();
if (InvokeRequired)
{
Invoke(new Action(() =>
label1.Text = stopwatch.ElapsedMilliseconds.ToString(CultureInfo.InvariantCulture)));
}
});
actionBlock.Complete();
actionBlock.Completion.Wait();
});
}
Windows Forms работает нормально... процесс не блокирует пользовательский интерфейс
Но если я изменю MaxDgreeOfParallelism на другое значение (2, 3 или 4...), пользовательский интерфейс будет заблокирован до завершения процесса.
Я вижу окно параллельных задач и окно потока в Visual Studio, и в обоих случаях все работает в рабочих потоках, но в последнем случае (когда MaxDgreeOfParallelism отличается от 1) пользовательский интерфейс не отвечает, пока процесс не завершится
Почему?