任务完成后更改光标

时间:2013-02-18 17:47:55

标签: c# .net wpf user-interface cursor

我正在尝试在任务开始前将鼠标光标更改为Wait,并在完成任务时将Arrow更改为this.Cursor = Cursors.Wait; dtResults.WriteXml(saveFileDialog.FileName); this.Cursor = Cursors.Arrow; MessageBox.Show("Exporting Complete!", "Complete!", MessageBoxButton.OK, MessageBoxImage.Information); 。但是,光标似乎会立即从一个变为另一个。这是我的代码:

{{1}}

关于我做错了什么的想法?

2 个答案:

答案 0 :(得分:2)

您正在同步执行任务。因此,消息泵从未真正获得等待光标调用,只要用户将看到。

要解决此问题,您应该异步执行此操作。您可以使用Task Parallel Library,因为您使用的是.NET 4.0:

this.Cursor = Cursors.Wait
//Avoid any closure problems
string fileName = saveFileDialog.FileName
//Start the task of writing the xml (It will run on the next availabled thread)
var writeXmlTask = Task.Factory.StartNew(()=>dtResults.WriteXml(fileName));
//Use the created task to attach what the action will be whenever the task returns.
//Making sure to use the current UI thread to perform the processing
writeXmlTask.ContinueWith(
    (previousTask)=>{this.Cursor = Cursors.Arrow;MessageBox.Show....}, TaskScheduler.FromCurrentSynchronizationContext());

答案 1 :(得分:0)

我的猜测是所有这一切都发生在UI线程上。由于DataTable.WriteXml是同步完成的,因此它会阻止UI并且不会进行任何更新。这就是为什么Cursor似乎永远不会显示为等待光标的原因。

要允许UI更新并显示等待光标,您需要将调用移至dtResults.WriteXml到后台线程。我建议使用BackgroundWorker