C# 异步更新用户界面
我正在玩异步操作,我现在的目标很简单。我只想在大型计算开始时更新一个文本字段,我面临的问题是,文本字段只会在C# 异步更新用户界面,c#,wpf,asynchronous,C#,Wpf,Asynchronous,我正在玩异步操作,我现在的目标很简单。我只想在大型计算开始时更新一个文本字段,我面临的问题是,文本字段只会在calculate()返回时更新,即使立即调用方法computingMessage(): private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { e.Handled = true; annunciate(); calculate();
calculate()
返回时更新,即使立即调用方法computingMessage()
:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
annunciate();
calculate();
}
private void annunciate(){
Thread updateUI = new Thread( new ThreadStart( computingMessage ));
updateUI.Start();
}
private void computingMessage(){
txtVerification.Dispatcher.Invoke((Action)(
() => txtVerification.Text = "Calculating..."
));
}
请检查物体
我希望它能帮助你。尽管我在精神上同意@dbvega。我不同意使用
Task.Factory.StartNew
。也不应使用调度程序。调用。默认情况下,运行WPF时,Task.Factory.CurrentScheduler
将设置为WPF消息pump scheduler。运行WinForms时,会自动设置WinForm调度程序
private async void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
var result = await Task.Run(Calculate);
TextBoxOutput.Text = result.ToString(CultureInfo.InvariantCulture);
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}
您正在阻止UI线程。你不必那样做。我也不知道为什么你要创建一个新的线程,但什么也不做,只是封送回UI线程去做一些事情。整个序列都是毫无意义的。@Servy我看不出我在哪里阻塞了UI线程。UI主线程正常继续。我想向主UI显示一条等待消息。calculate
正在阻止UI线程。这就是为什么UI在完成之前不会更新;它阻塞了UI线程。你没有抓住要点。如果您的方法的任何部分阻塞了UI线程,那么在您的方法完成之前,UI中不会发生任何事情。@Servy,我甚至不知道您现在的意思,我认为您完全没有注意到这个问题。代码不错,虽然我的目标很简单,但请查看我的答案。好的,我进入了async/Wait,它比后台工作人员做得更干净。很容易证明@如果您使用.NET4.5或最新版本,那么这是一个很好的代码。我用.NET4.0写了我的答案。无论如何,我更新了我的答案。Thanks@dbvega此代码在.net4.0中使用(如果您将Task
重命名为TaskEx
)和异步目标包。
private async void Button_Click(object sender, RoutedEventArgs e)
{
TextBoxOutput.Text = "calculating...";
var result = await Task.Run(Calculate);
TextBoxOutput.Text = result.ToString(CultureInfo.InvariantCulture);
}
private int Calculate()
{
Thread.Sleep(2000); //--similate working....
return Environment.TickCount ^ 43;
}