我正在尝试在任务开始前将鼠标光标更改为Wait
,并在完成任务时将Arrow
更改为this.Cursor = Cursors.Wait;
dtResults.WriteXml(saveFileDialog.FileName);
this.Cursor = Cursors.Arrow;
MessageBox.Show("Exporting Complete!", "Complete!", MessageBoxButton.OK, MessageBoxImage.Information);
。但是,光标似乎会立即从一个变为另一个。这是我的代码:
{{1}}
关于我做错了什么的想法?
答案 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