Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步更新用户界面_C#_Wpf_Asynchronous - Fatal编程技术网

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;
}