C# 在WPF应用程序中运行多个后台任务-UI更新暂停

C# 在WPF应用程序中运行多个后台任务-UI更新暂停,c#,wpf,multithreading,C#,Wpf,Multithreading,我已经尝试了很多这种代码的变体。不管怎样,我都收到了同样的问题。UI更新开始正常,然后暂停,直到整个过程完成。有人能给我指出正确的方向吗 场景 在WPF应用程序中,我们将使用传递的不同参数调用同一API数千次。我们需要收集所有的回复并做些事情 示例代码 List<Task> tasks = new List<Task>(); for (int i = 1; i <= iterations; i++) { Task t = SampleTask(new Sam

我已经尝试了很多这种代码的变体。不管怎样,我都收到了同样的问题。UI更新开始正常,然后暂停,直到整个过程完成。有人能给我指出正确的方向吗

场景

在WPF应用程序中,我们将使用传递的不同参数调用同一API数千次。我们需要收集所有的回复并做些事情

示例代码

List<Task> tasks = new List<Task>();

for (int i = 1; i <= iterations; i++)
{
   Task t = SampleTask(new SampleTaskParameterCollection { TaskId = i, Locker = locker, MinSleep = minSleep, MaxSleep = maxSleep });
   tasks.Add(t);
}

Task.WhenAll(tasks);

当前回购协议位于。查看SimpleWindow。

不要创建数千个任务-这将导致巨大的性能问题

相反,使用类似于
Parallel.For()
的方法来限制同时运行的任务数量;例如:

Parallel.For(1,
    iterations + 1,
    (index) =>
    {
        SampleTask(new SampleTaskParameterCollection { TaskId = index, Locker = locker, MinSleep = minSleep, MaxSleep = maxSleep });
    });
此外,如果UI更新所用的时间超过调用
BeginInvoke()
之间的间隔,则调用将开始排队,事情将变得糟糕

为了解决这个问题,您可以在SampleTask()中使用一个计数器,每N次调用只实际更新UI一次(使用合适的N值)


但是,请注意,为了避免线程问题,在递增和检查计数器值时,必须使用
Interlocked.Increment()
(或其他锁)。您还必须确保在所有工作完成后最后一次更新UI。

可能发生的情况是,将文本添加到文本框并滚动到最后所需的时间比更新之间的时间长,这会导致所有内容都停止。您可能需要不太频繁地更新UI。另外,不要创建数千个任务!这肯定会破坏一切。这段代码和您的回购协议中的代码没有编译。您不能将new与方法一起使用此处发布的代码无法编译-如果
SampleTask
是一个方法,则
new SampleTask(…)
无法编译。您可以在挂起期间暂停调试器并发布调用堆栈吗?这样我们就可以知道是什么阻塞了UI线程。顺便说一句,
Task.whalll(任务)
什么也不做。
new SampleTask(…
表示
SampleTask
是一个类,
private void SampleTask(…
表示它是一个方法。非常混乱。谢谢Matthew。我确实使用了Parallel。因为在另一次尝试中,我认为您发送太多UI更新是正确的。我会解决这个问题。
Parallel.For(1,
    iterations + 1,
    (index) =>
    {
        SampleTask(new SampleTaskParameterCollection { TaskId = index, Locker = locker, MinSleep = minSleep, MaxSleep = maxSleep });
    });