当前位置: 首页 > 知识库问答 >
问题:

UI线程上的异步WPF多状态更新

晁璞
2023-03-14

我想从一个长期运行的方法状态更新。通常我会使用dispatcher回发到UI线程,但我对使用async Await很好奇。

为了简单起见:

<Button Name="ButtonWithCodeBehind" Height="25" Click="ButtonWithCodeBehindOnClick"/>
private async void ButtonWithCodeBehindOnClick(object sender, RoutedEventArgs e)
{
    await Task.Factory.StartNew(() =>
    {
        ButtonWithCodeBehind.Content = "First";
        Thread.Sleep(1000);
        ButtonWithCodeBehind.Content = "Second";
        Thread.Sleep(1000);
        ButtonWithCodeBehind.Content = "Third";
    });
}
Deployment.Current.Dispatcher.BeginInvoke(()=>ButtonWithCodeBehind.Content = "Second");
private async void ButtonWithCodeBehindOnClick(object sender, RoutedEventArgs e)
{
    var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
    await Task.Factory.StartNew(() =>
    {
        Task.Factory.StartNew(() => Thread.Sleep(1000))
            .ContinueWith(t => ButtonWithCodeBehind.Content = "First", scheduler)
            .ContinueWith(t => Thread.Sleep(1000))
            .ContinueWith(t => ButtonWithCodeBehind.Content = "Second", scheduler)
            .ContinueWith(t => Thread.Sleep(1000))
            .ContinueWith(t => ButtonWithCodeBehind.Content = "Third", scheduler);
    });
}

但这是Fugly。此外,如果您去掉async和await关键字并将其替换为task.waitall,它仍将按预期执行。

注意:如果您想知道为什么我使用thread.sleep而不是task.delay,我实际上也在Silverlight中测试了这一点,异步等待支持不包括。delay(或者至少不包括我期望的位置)。

共有1个答案

锺离辰沛
2023-03-14

如果您可以将长时间运行的任务拆分为两个不同的长时间运行的操作(就像上面示例中的两个Thread.Sleeps),您可以单独等待每个长时间运行的任务。因此UI更新将在UI线程上执行。

private async void ButtonWithCodeBehindOnClick(object sender, RoutedEventArgs e)
{
  ButtonWithCodeBehind.Content = "First";
  await Task.Run(() => Thread.Sleep(1000));
  ButtonWithCodeBehind.Content = "Second";
  await Task.Run(() => Thread.Sleep(1000));
  ButtonWithCodeBehind.Content = "Third";
}
 类似资料:
  • 我一直在四处寻找有类似问题的人,但没有找到任何东西。我正在编写一个使用WPF UI的C#应用程序。 为了更新progressbar,我不能像以前一样(在CLI中)使用多线程,因为它告诉我,如果UI元素不来自主线程,我就不能更新它。 一个解决方案是创建后台工作者。我已经实现了这个解决方案,它工作得很好,但是我希望将任务分配给更多的工作者/线程(多线程),以提高效率。 我不知道我该走的方向。如果有人能

  • > 我是Java多线程的新手。想知道线程池执行器中空闲线程的状态。它在RUNNABLE/WAITING中吗? 如果空闲线程处于RUNNABLE状态,新任务如何附加到空闲线程?AFAIK我们为线程/池分配一个可运行/可调用的对象。但我的问题是ThreadPoolExecitor如何将排队的可运行对象分配给空闲线程??

  • 我正在编写一个WPF表单应用程序,在其中我试图循环通过一个文件夹并实时显示其文件,使用异步等待方法。在我的任务中。运行()方法我正在引发我的事件,这会引发罚款,但是事件代码也会更新UI线程上的文本框,因此我UI线程错误 '调用线程无法访问此对象,因为另一个线程拥有它。' .有什么方法可以更改我的代码,以便我可以更新我的TextBox? 和我的事件处理程序代码

  • 本文向大家介绍IOS多线程开发之线程的状态,包括了IOS多线程开发之线程的状态的使用技巧和注意事项,需要的朋友参考一下 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行。改变这种状况可以从两个角度出发:对于单核处理器,可以将多个

  • 我对状态同步有问题。当我点击编辑器的外部(想要关闭它),我想把实际的文本传回给父节点(函数)。但是当我在之外单击时,状态似乎总是落后一步。(例如:如果编辑器内部有,我键入,,我键入,等等)。 如果我在编辑器外单击,将出现的实际状态,如何实现这一点?

  • 我有一个spring boot微服务,我们在其中调用多个服务(比如服务a和服务B)。我试图根据某些条件在多个线程上异步调用这两个服务,一旦处理完成,我想合并服务A和服务B的响应。 我知道我们可以使用@Async异步运行一个进程,并使用ExecutorService为一个服务启动多个线程。 但是我不确定如何把所有的东西放在一起。所以在这里寻找任何建议? 我知道这在上面主要是理论上解释的,但我尝试了跟