Не создавайте тысячи задач - это вызовет огромные проблемы с производительностью.
Вместо этого используйте что-то вроде Parallel.For()
, чтобы ограничить количество одновременно запускаемых задач; например:
Parallel.For(1,
iterations + 1,
(index) =>
{
SampleTask(new SampleTaskParameterCollection { TaskId = index, Locker = locker, MinSleep = minSleep, MaxSleep = maxSleep });
});
Кроме того, если обновления пользовательского интерфейса занимают больше времени, чем интервал между вызовами на BeginInvoke()
, то вызовы начинают ставиться в очередь, и все становится неприятным.
Чтобы решить эту проблему, вы можете использовать счетчик в SampleTask () для фактического обновления пользовательского интерфейса только один раз при каждом вызове N (с подходящим значением для N).
Однако учтите, что во избежание проблем с потоками вы бы необходимо использовать Interlocked.Increment()
(или какую-либо другую блокировку) при увеличении и проверке значения счетчика. Вам также необходимо убедиться, что вы обновили интерфейс в последний раз, когда вся работа будет выполнена.