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