热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#用户界面更新不确定分享

C#用户界面更新不确定UWP应用程序,C#,VisualStudio2017,Windows10CreatorsUpdate(10.0;Build15063)。我们将TextBlo

C#用户界面更新不确定

UWP应用程序,C#,Visual Studio 2017,Windows 10 Creators Update(10.0; Build 15063)。

我们将TextBlock1称为T1,将TextBlock2称为T2 …所需的输出是:

T1显示“工作已开始”。

T2显示“第1步”

T2显示“第2步”

T2显示“”

T1显示“完成工作”。

private async void Btn_Click(object sender, RoutedEventArgs e) { TextBlock1.Text = "Work started."; await DoWork(); TextBlock1.Text = "Work done."; } private async Task DoWork() { TextBlock2.Text = "Step 1"; await Task.Delay(1); //Pretend to do something TextBlock2.Text = "Step 2"; await Task.Delay(1); //Pretend to do something TextBlock2.Text = ""; } 

当我调试时,实际输出是不确定的:

1:TextBlock更新在我进入await或事件处理程序关闭时发生。

2:有时TextBlock更新发生在等待#1,有时等待#2,有时两者都有,有时两者都没有。

3:无论先前的事件如何,T1都会显示“已完成工作”。 和T2将在Btn_Click()的末尾显示“”。

当我请求UI更新时,我希望程序除了执行更新所需的操作外什么都不做 在UI上显示更新之前,它不应该继续我的下一个请求。

我花了好几天时间。 可能吗?

我找到了一种方法来消除这个问题的非确定性方面。 但我真的不明白发生了什么,它仍然不符合上面的粗体要求:

  private async Task UpdateTextInUI(TextBlock textBlock, string str) { await textBlock.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { textBlock.Text = str; })); } 

让我为你分解一下:

  1. TextBlock更新仅在我进入await或事件处理程序关闭时发生。

这是完全正常的。 await调用基本上会做下一件事:启动给定的函数,直到它正在继续返回被调用者。 这也意味着,当您等待的函数返回时,范围将在await之后立即返回。 因此,如果等待的function非常快,那么UI可能没有足够的时间来应用您的更改。

  1. 有时TextBlock更新发生在等待#1,有时等待#2,有时两者都有,有时两者都没有。

与上面相同,有时UI有足够的时间,有时则没有。 线程很有趣。 它们是非确定性的。

  1. 无论以前的事件如何,T1都会显示“已完成工作”。 和T2将在Btn_Click()的末尾显示“”。

在DoWorkfunction完成后,UI将获得完全控制权,因此它可以应用所有更改 – >最后应用的文本值。

编辑:

如果您真的想要更新UI,可以await Task.Yield() 。 这将迫使UI获得后退控制权。

上述就是C#学习教程:C#用户界面更新不确定分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
author-avatar
仲颖凯翰奕颖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有