在我的WPF应用程序中,我使用构造函数中的Dispatcher.BeginInvoke
加载内容。我的问题是它会阻止UI线程吗?
或者最好使用Task.Factory.StartNew
然后在UI上重新发送内容,以便无论加载内容的处理时间如何,都将首先加载应用程序?
哪种方法更好?为什么?
答案 0 :(得分:22)
他们做了两件截然不同的事情:
Task.Factory.StartNew
安排委托执行a
线程池线程。当前线程继续运行而不等待此任务的结果(异步)。通常,您会生成一个运行时间较长的后台任务,以便UI不会被阻止太长时间(而不是"冻结")。
Dispatcher.BeginInvoke
安排委托执行
调度程序(UI)线程。通常这样做是为了更新某些UI
控件与一些在a上执行的操作的结果
背景线程。基本上你在这里更新UI。
直接回答你的问题:
您不应该在Dispatcher线程上安排冗长的操作,通常您只想在此处更新UI控件。委托中的代码将在UI线程上执行,该线程在执行时被阻止。只需在当前代码中放置Thread.Sleep(10000)
(您从构造函数中调度),您将看到UI将冻结。使用后台任务 - 使用Task
或后台工作程序(两者都将使用线程池线程)。
或者使用Task.Factory.StartNew然后调度更好 在UI上返回的东西,以便应用程序将首先加载,而不管是什么 加载内容处理时间。
是!