我应该采用什么WPF线程方法?

时间:2011-09-28 11:56:06

标签: wpf multithreading textbox backgroundworker

我正在编写一个WPF应用程序(新技术,大多数时候我一直在用WinForms编写)。我的目标是让UI响应整个时间,并且我已经读过它可以使用Threading / BackgroundWorker获得。我认为我应该使用后台工作者来处理耗时的方法。但我计划使用方法* m_AddLog(string logText)*,它应该将文本附加到文本框。我希望从主UI线程以及后台工作者调用此方法,因此消息将在后台处理时立即发送,而不是等待后台任务结束。请问你如何正确地写这些方法来为UI提供完全响应,因为我不太了解代表,调用,后台工作者等等?

3 个答案:

答案 0 :(得分:7)

如果您想运行一些后台进程,那么在完成时更新UI,以下模式运行良好(如果从UI线程运行)。

Task.Factory.StartNew(() =>
            {
                // Background work
            }).ContinueWith((t) => {
                // Update UI thread

            }, TaskScheduler.FromCurrentSynchronizationContext());

将后台工作放在第一个任务中,UI工作在以下任务中。 TaskScheduler选项确保第二个任务在UI线程上运行。

答案 1 :(得分:2)

使用任务和调度程序的wpf应用程序中的大多数项目都会产生更好的结果。

看看下面的代码希望这可以帮助你.. 在下面的代码中,我考虑了一个场景,比如从远程服务器获取图像,我创建了一个任务,用于执行该操作...在for循环的任务中,我使用调度线程更新UI以通知进度...之后获取所有图像执行将被移动以继续阻止.... 您可以查看以下link,以帮助您更好地理解

ObservableCollection items= new ObservableCollection();
TaskFactory tFactory = new TaskFactory();
tFactory.StartNew(() =>
{
for (int i = 0; i < 50; i++)
{
//Request to server
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)delegate()
{
// UPDATE PROGRESS BAR IN UI
});

items.Add(("");
}

}).ContinueWith(t =>
{
if (t.IsFaulted)
{
// EXCEPTION IF THREAD IS FAULT
throw t.Exception;
}
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)delegate()
{
//PROCESS DATA AND DISPLAY
});
});

答案 2 :(得分:2)

正如人们所说,有很多问题会告诉你如何做到这一点但是如果你想比较它,你可以找到它here并进行详细比较