当前位置: 首页 > 编程日记 > 正文

C# async await 学习笔记2

C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html)

提到了ThreadId是一样的,突然想到在WinForm中,非UI线程是无法直接更新UI线程上的控件的问题。

于是做了如下测试:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Task<string> LongTimeTask(){tbResult.Text += "LongTimeTask开始:" + DateTime.Now.ToString() + "\r\n";             Task<string> task = new Task<string>(() => { Thread.Sleep(5000); return "这是任务返回值"; });task.Start();tbResult.Text += "LongTimeTask结束:" + DateTime.Now.ToString() + "\r\n";    return task;}async void AsyncCall(){tbResult.Text += "AsyncCall开始:" + DateTime.Now.ToString() + "\r\n";     string result = await LongTimeTask(); //await调用的方法需要返回Task或Task<T>,且调用await所在的方法要有async关键字tbResult.Text += "AsyncCall:" + result + "\r\n"; tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n"; }   private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";AsyncCall();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

发现,在AsyncCall中,可以直接访问TextBox(tbResult),如果对上面的测试觉得没什么奇怪,大家可以先看下面的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form2 : Form{public Form2(){InitializeComponent();}void LongTimeTask(){Thread.Sleep(5000);tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n";} private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";Thread t = new Thread(LongTimeTask);t.Start();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

运行到 LongTimeTask的tbResult.Text时,提示:线程间操作无效: 从不是创建控件“tbResult”的线程访问它。

为了能在非UI线程中访问到UI线程中的控件,于是需作如下修改:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsFormsApplication1
{public partial class Form2 : Form{delegate void UpdateUIDelegate();UpdateUIDelegate updateUIDelegate;        public Form2(){InitializeComponent();updateUIDelegate = new UpdateUIDelegate(UpdateUI);}void UpdateUI(){if (tbResult.InvokeRequired){tbResult.Invoke(updateUIDelegate);}else{tbResult.Text += "AsyncCall结束:" + DateTime.Now.ToString() + "\r\n";}}void LongTimeTask(){Thread.Sleep(5000);UpdateUI();        } private void button1_Click(object sender, EventArgs e){tbResult.Text += "Main开始:" + DateTime.Now.ToString() + "\r\n";Thread t = new Thread(LongTimeTask);t.Start();tbResult.Text += "Main结束:" + DateTime.Now.ToString() + "\r\n";}}
}

转载于:https://www.cnblogs.com/siso/p/3691494.html

相关文章:

不走寻常路 设计ASP.NET应用程序的七大绝招

随着微软.NET的流行&#xff0c;ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员&#xff0c;我们不仅需要掌握其基本的原理&#xff0c;更要多多实践&#xff0c;从实践中获取真正的开发本领。在我们的实际开发中&#xff0c;往往基本的原理满足不了开发需求&#…

记录Linux下的钓鱼提权思路

参考Freebuf上的提权文章&#xff08;利用通配符进行Linux本地提权&#xff09;&#xff1a;http://www.freebuf.com/articles/system/176255.html 以两个例子的形式进行记录&#xff0c;作为备忘&#xff1a; 0x01 Chown的--reference特性 存在三个用户&#xff1a;root、yuns…

(C++)strlen(),strcmp(),strcpy(),strcat()用法

string.h中包含了许多用于字符数组的函数。使用前需要在程序开头加string.h©或cstring(C)头文件 strlen() 作用&#xff1a;得到字符数组第一个结束符\0前的字符的个数 #include<cstdio> #include<cstring>int main(){char str[50];gets(str);printf("…

springMvc+mybatis+spring 整合 包涵整合activiti 基于maven

2019独角兽企业重金招聘Python工程师标准>>> 最近自己独立弄一个activiti项目&#xff0c;写一下整合过程&#xff1a; 环境&#xff1a;jdk1.7 tomcat7.0 maven3.5 eclipse mysql5.5 --我的工程结构&#xff0c;怎么创建一个maven项目就不在这里写了&#xff1a; …

(原)Eclipse 字体过小问题

刚解压/安装的eclipse(或者myeclipse,sts等因为默认使用Consolas字体的原因,中文字会显得非常小 解决办法搜索网络无非两种:1.不想太麻烦去下字体的话,就将eclipse的字体改为Courier New,方法如下:A.进入eclipse配置,找到编辑字体的地方: window->perferences->General-&…

一个饼形图形报表

最近在做一个统计投票数量的图形报表,主要借鉴了一个51aspx中的一个例子,因为要在一页中显示多个图形,所以选择了在pannel中动态添加Image控件.效果图如下:/// <summary>/// 饼形图形报表/// </summary>/// <param name"target">Stream对象的实例&…

(C++)从字符串中取出整形、浮点型和字符串

目的&#xff1a;从字符串"330:20.20:yoyo"中取出整数330&#xff0c;浮点数20.20和字符串"yoyo" #include<cstdio> #include<cstring>int main(){char str[50]"330:20.20:yoyo";int n;double g;char sstr[40];sscanf(str,"%d…

[C#]网络编程系列专题二:HTTP协议详解

转自&#xff1a;http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后&#xff0c;当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求&#xff0c;此时就使用了应用层的HTTP协议&#xff0c;在上一个专题我们简单介…

Python3 与 C# 并发编程之~ Net篇

NetCore并发编程 示例代码&#xff1a;https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念&#xff08;其实之前也有说&#xff0c;所以简说下&#xff09;&#xff1a; 并发&#xff1a;同时做多件事情多线程&#xff1a;并发的一种形式并…

tomcat5.5.9+sql2000数据库连接池配置

终于解决了困扰多天的连接池的问题&#xff0c;写下这编文章与大家一起分享。我是在tomcat5.5.9下配置的&#xff0c;tomcat5.5.X和以前的版本有一些差别&#xff0c;所以配置上也有差别。我就说一下在tomcat5.5.9配置的基本步骤&#xff1a;&#xff08;确定你以安装好tomcat5…

(C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

题目描述 有一行电文&#xff0c;已按如下规律译成密码&#xff1a; A–>Z a–>z B–>Y b–>y C–>X c–>x … … 即第一个字母变成第26个字母&#xff0c;第i个字母变成第&#xff08;26-i1)个字母&#xff0c;非字母字符不变。要求根据密码译回原文&a…

mysql++读写BLOB数据

mysql读写BLOB数据 1、使用sql_create_n宏函数&#xff0c;建立数据库表字段与对象。 #define sql_create_2(NAME, CMP, CONTR, T1, I1, T2, I2) \ sql_create_complete_2(NAME, CMP, CONTR, T1, I1, #I1, T2, I2, #I2) \ //NAME&#xff1a;表名&#xff1…

oracle RAC的VIP和scan

我们都知道Oracle RAC中每个节点都有一个虚拟IP&#xff0c;简称VIP&#xff0c;与公网IP在同一个网段。 没有VIP时&#xff0c;Oracle客户端是靠“TCP/IP协议栈超时”来判断服务器故障。而TCP/IP协议栈是作为OS Kernel的一部分来实现&#xff0c;不同的OS有不同的阀值&#xf…

2007年你必须学习的10项.NET技术

1、WCF (Windows Communication Foundation):虽然WCF显然没有WPF或SilverLight那么吸引人,但是它却是在.NET框架下解决业务问题的基础。所以你今年至少要学习一门.NET的新技术,那你就选择WCF吧。 2、ADO.NET (and LINQ):这是让你与数据层打交道的技术。并且LINQ提供了将各种数据…

(C++)用指针实现两数交换函数swap()的两种方法

#include<cstdio>//用指针写swap()函数 void swap_1(int* p1,int* p2){int temp *p1;*p1 *p2;*p2 temp; } //用指针和指针的引用写swap()函数 void swap_2(int* &p1,int* &p2){int* temp p1;p1 p2;p2 temp; } int main(){int a 2020,b2021;int *p1&a,…

【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(上)

简介&#xff1a; 本文翻译自《iOS7 by Tutorials》一书的第一章“Designing for iOS 7”&#xff0c;主要从程序员角度介绍了iOS7的新设计理念&#xff0c;堪称神作&#xff01;本文翻译仅作学习交流之用&#xff0c;版权归原作者所有&#xff0c;有删减。非专业翻译人士粗糙之…

有兴趣的执行一下这段代码

有兴趣的执行一下这段代码&#xff1a;staticpublicstringGetConfigiuageConnString() { Guid dataLinksGuid new Guid("2206cdb2-19c1-11d1-89e0-00c04fd7a829"); Type dataLinksType Type.GetTypeFromCLSID(dataLinksGuid, true); …

python爬虫知识点总结(二十三)Scrapy中Download Middleware的用法

待更新转载于:https://www.cnblogs.com/cthon/p/9424551.html

(C++)输入3个字符串,按从小到大的顺序输出。

#include<cstdio> #include<cstring> //1.利用指针编写两个字符串的比较函数 //2.利用二位字符数组接收3个字符串 //3.输出排序后的字符串 void s_to_b(char str1[10],char str2[10]){char temp[10];strcpy(temp,str1);strcpy(str1,str2);strcpy(str2,temp); }void…

Mysql备份还原数据库之mysqldump实例及参数详细说明

我们在运营项目的过程中肯定会遇到备份数据库&#xff0c;还原数据库的情况&#xff0c;我们一般用一下两种方式来处理&#xff1a; 1.使用into outfile 和 load data infile导入导出备份数据 这种方法的好处是&#xff0c;导出的数据可以自己规定格式&#xff0c;并且导出的是…

女性护理品牌Honeymate获8000万A+轮融资,将与美图公司深度合作

8月5日消息&#xff0c;女性护理品牌“美则Honeymate”于今年7月获美图公司8000万A轮战略融资&#xff0c;资金主要用于品牌扩张以及用户体系、会员体系的建立&#xff0c;也将与美图公司深度合作&#xff0c;为美图超5亿用户创造更多价值。 美则Honeymate&#xff08;深圳市护…

桌面图标不透明的小问题处理

"我的电脑"--"属性"--"高级"--"设置",将下框"在桌面上为图标标签使用阴影"打勾. 在"自定义桌面"里去除相应"桌面网页"项.通过如上两步一般就可以去除图标后面的方框背景, 早上一来遇到位同事问我桌面图…

<论文翻译>RepVGG: Making VGG-style ConvNets Great Again

RepVGG:让VGG风格的卷积网络再一次伟大 文章目录RepVGG:让VGG风格的卷积网络再一次伟大摘要1. Introduction2. Related Work2.1 从单路径到多分支2.2 有效的单路径模型的训练2.3 模型重新参数化2.4 温诺格勒(Winograd)卷积3. 通过结构性重新参数化构建RepVGG3.1 简单就是快&…

关于android布局的两个属性dither和tileMode,background 平铺

http://blog.csdn.net/yuxiaohui78/article/details/8196043转载于:https://www.cnblogs.com/leihupqrst/p/3711725.html

volatile - 如何实现线程安全

2019独角兽企业重金招聘Python工程师标准>>> volatile关键字&#xff0c;在我之前的博客 Volatile - 用途 中已经简单讲解过&#xff0c;当时提出了volatile在多线程中是不安全的。本文将重点介绍一种使用方式&#xff0c;可以实现线程安全。 首先&#xff0c;来看一…

【我翻译的文章】你还需要数据层吗?

随着LINQ的临近发布&#xff0c;独立数据访问层的必要性需要重新进行评估了。它是否仍是应用程序设计的一个重要部分&#xff1f;或者它是否会变成一个过去的附属物&#xff1f; 详细信息请访问&#xff1a;http://www.infoq.com/cn/news/2007/08/DAL转载于:https://www.cnblog…

正则表达式最常用的符号匹配

字符描述\d代表任意数字&#xff0c;就是阿拉伯数字 0-9 这些玩意。\D大写的就是和小写的唱反调&#xff0c;\d 你代表的是任意数字是吧&#xff1f;那么我 \D 就代表不是数字的。\w跟 \w 唱反调&#xff0c;代表不是字母&#xff0c;不是数字&#xff0c;不是下划线的。\n代表…

一道多线程编程题

有意思的一道多线程编程题请用多线程显示&#xff0c;每三个数字为一组&#xff0c;直到30线程A&#xff1a;1线程A&#xff1a;2线程A&#xff1a;3线程B&#xff1a;4线程B&#xff1a;5线程B&#xff1a;6线程A&#xff1a;7线程A&#xff1a;8线程A&#xff1a;9public cla…

垃圾回收机制:

2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收机制&#xff1a; 1、GC通过确定对象是否被活动对象引用来确定是否收集该对象。 2、触发GC的条件 1)GC在优先级最低的线程中运行&#xff0c;一般在应用程序空闲即没有应用线程在运行时被调用。但下面的条件例外…

爬虫入门知识笔记

1.爬虫是什么 定义一&#xff1a; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟浏览器发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动地抓取互联网信息的程序。原则上,只要是浏览器(客户端)能做的事…