C# 在WPF应用程序中运行多个后台任务-UI更新暂停
我已经尝试了很多这种代码的变体。不管怎样,我都收到了同样的问题。UI更新开始正常,然后暂停,直到整个过程完成。有人能给我指出正确的方向吗 场景 在WPF应用程序中,我们将使用传递的不同参数调用同一API数千次。我们需要收集所有的回复并做些事情 示例代码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
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 });
});