C#使用多线程使软件界面具有较好的响应性

发布时间: 2020-11-26 00:57  标签:C# 多线 响应 界面 具有

C#使用多线程使软件界面具有较好的响应性

软件界面的响应特性是判断一款软件的非常重要的方面。一般来说,不管你软件功能做得有多么奇妙,如果软件有一点点死机的感觉都会让用户感到很讨厌,甚至怀疑你软件里是否藏有更大的问题。

要提高界面的响应特性,最好的办法莫过于使用多线程,并把呈现界面的线程独立出来。以前只有使用C++才能实现的多线程功能,现在在.Net框架下,所有的语言(包括VB)都可以使用了。不过,使用多线程比使用单一线程要麻烦得多,比如线程之间的同步问题,做得不好很容易出错,而有的时候这种错误要开发人员花上几个星期的时间才能找到。在Windows Form软件中使用多线程更是有一些限制。

下面我们就把在Windows Form软件中使用多线程要注意的问题给大家做一个介绍。

先,什么样的操作需要考虑使用多线程?总的一条就是,负责与用户交互的线程(以下简称为UI线程)应该保持顺畅,当UI线程调用的API可能引起阻塞时间超过30毫秒时(比如访问CD-ROM等速度超慢的外设、进行远程调用等等)就应该考虑使用多线程。为什么是30毫秒?30毫秒的概念是人眼可以察觉到的一个迟滞,大约等同于电影里的一帧停留的时间,最长不要超过100毫秒。

第二,最方便和简单的多线程是使用线程池。通过线程池里的线程运行代码的最简便方法则是使用异步委托调用。注意委托调用通常是同步完成的,请使用BeginInvoke方法,这样就可以把要调用的方法排队到线程池里等候处理,而程序的流程会立刻返回到调用方(此处是UI线程),而调用方因此不会出现阻塞。

看看下面的例子我们就发现要使用线程池异步执行代码也并非十分复杂,这里我们利用System.Windows.Forms.MethodInvoker委托进行异步调用。注意MethodInvoker委托不接受方法参数,如果需要向异步执行的方法传递参数,请使用其他委托,或者需要自己定义。

private void StartSomeWorkFromUIThread () {

// 我们要做的工作相对UI线程而言台慢了,用下面的方法异步进行处理

MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread);//这是入口方法

mi.BeginInvoke(null, null); // 这样就不会阻塞

}

// 缓慢的工作在此方法内进行处理,使用线程池里的线程

private void RunsOnWorkerThread() {

DoSomethingSlow();

}

归纳上述方法,对UI线程而言实际上就是:1、发出调用,2、立刻返回,具体运行过程不理了,这样UI线程就不会被阻塞。这种方法很重要,下面我们会深入介绍。除了上面的方

法,还有其他使用线程池的方法,当然如果你高兴也可以自己创建线程。

第三,在Windows Form中使用多线程的,最重要的一条注意事项是,除了创建控件的线程以外,绝对不要在任何其他线程里面调用控件的成员(只有极个别情况例外),也就是说控件属于创建它的线程,不能从其他线程里面访问。这一条适用于所有从System.Windows.Forms.Control派生的控件(因此可以说是几乎所有控件),包括Form控件本身也是。举一反三,我们很容易得出这样的结论,控件的子控件必须由创建控件的线程来创建,比如一个表单上的按钮,比如由创建表单的线程来创建,因此,一个窗口中的所有控件实际上都活在同一个线程之中。在实际编程时,大多数的软件的做法都是让同一线程负责全部的控件,这就是我们所说的UI线程。看下面的例子:

// 这是由UI线程定义的Label控件

private Label lblStatus;

....

// 以下方法不在UI线程上执行

private void RunsOnWorkerThread() {

DoSomethingSlow();

lblStatus.Text =

}

我们要特别提醒大家,很多人刚开始的时候都会使用以上的方法来访问不在同一个线程里的控件(包括笔者本人),而且在1.0版.Net 框架上似乎没有发现问题,但是这根本就是错的,更糟糕的是,程序员在这里不会得到任何错误提示,一开始就上当受骗,之后会莫明其妙地发现其他错误,这就是Windows Form多线程编程的痛苦所在。笔者试过花很多时间来Debug自己写的Splash窗口突然消失的问题,结果还是失败了:笔者在软件的引导过程中,用另外一个线程里创建了一个Splash窗口来显示欢迎信息,然后尝试把主线程里引导的状态直接写入到Splash窗口上的控件中,开始还OK,可是过一会Splash窗口就莫明其妙消失了。

理解了这一点,我们应该留意到,有时候即使没有用System.Threading.Thread来显式创建一个线程,我们也可能因为使用了异步委托的BeginInvoke方法来隐式创建了线程(从线程池里),在这种线程里也同样不能调用UI线程所创建的控件的成员。

第四,由于上述限制,我们可能会感到很不方便,的确,当我们利用一个新创建的线程来执行某些花时间的运算时,怎样知道运算进度如何并通过UI反映给用户呢?解决方法很多!比如熟悉多线程编程的用户很快会想到,我们采用一些低级的同步方法,工作者线程把状态保存到一个同步对象中,让UI线程轮询(Polling)该对象并反馈给用户就可以了。不过,这还是挺麻烦的,实际上不用这样做,Control类(及其派生类)对象有一个Invoke方法很特别,这是少数几个不受线程限制的成员之一。我们前面说到,绝对不要在任何其他线程里面调用非本线程创建的控件的成员时,也说了“只有极个别情况例外”,这个Invoke方法就是极个别情况之一----Invoke方法可以从任何线程里面调用。下面我们来讲解Invoke方法。

Invoke方法的参数很简单,一个委托,一个参数表(可选),而Invoke方法的主要功能就是帮助你在UI线程(即创建控件的线程)上调用委托所指定的方法。Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,如果是,直接执行委托指向的方法,如果不是,它

将切换到UI线程,然后执行委托指向的方法。不管当前线程是不是UI线程,Invoke都阻塞直到委托指向的方法执行完毕,然后切换回发出调用的线程(如果需要的话),返回。注意,使用Invoke方法时,UI线程不能处于阻塞状态。以下MSDN里关于Invoke方法的说明:

“控件上有四种方法可以安全地从任何线程进行调用:Invoke、BeginInvoke、EndInvoke 和 CreateGraphics。对于所有其他方法调用,则应使用调用 (invoke) 方法之一封送对控件的线程的调用。

委托可以是 EventHandler 的实例,在此情况下,发送方参数将包含此控件,而事件参数将包含 EventArgs.Empty。委托还可以是 MethodInvoker 的实例或采用 void 参数列表的其他任何委托。调用 EventHandler 或 MethodInvoker 委托比调用其他类型的委托速度更快。”

好了,说完Invoke,顺便说说BeginInvoke,毫无疑问这是Invoke的异步版本(Invoke是同步完成的),不过大家不要和上面的System.Windows.Forms.MethodInvoker委托中的BeginInvoke混淆,两者都是利用不同线程来完成工作,但是控件的BeginInvoke方法总是使用UI线程,而其他的异步委托调用方法则是利用线程池里的线程。相对Invoke而言,使用BeginInvoke稍稍麻烦一点,但还是那句话,异步比同步效果好,尽管复杂些。比如同步方法可能出现这样一种死锁情况:工作者线程通过Invoke同步调用UI线程里的方法时会阻塞,而万一UI线程正在等待工作者线程做某件事时怎么办?因此,能够使用异步方法时应尽量使用异步方法。

下面我们利用所学到的知识来改写上面那个简单的例子:

// 这是由UI线程定义的Label控件

private Label lblStatus;

....

// 以下方法不在UI线程上执行

private void RunsOnWorkerThread() {

DoSomethingSlow();

// Do UI update on UI thread

object[] pList = { this, System.EventArgs.Empty };

lblStatus.BeginInvoke(

new System.EventHandler(UpdateUI), pList);

}

....

// 切换回UI线程执行的入口

private void UpdateUI(object o, System.EventArgs e) {

//现在没问题了,使用Invoke使得线程总是回到UI线程,所以我们可以放心大胆地调用控件的成员了

lblStatus.Text =

}

第五,关于多线程编程还要考虑线程之间的同步问题、死锁和争用条件,有关这类问题的文

章很多,我们就不赘述了。


相关内容

  1. 长春理工大学校徽校标

    文档编号:0000144VI设计长春理工大学(蓝图VI设计内部资料)一个优秀的VI设计是可以将学校的办学理念得以充分的展现,是高度发展信息社会需要的,它可以使学校的面貌更加光彩照人,有利于学校建立良好的形象,并将学校形象能得到具体的视觉展示,从而更容易被社会接受和认可。大学校园VI设计(LOGO)的目的和宗旨,就是将大学校园形象要素,包括各种深层的形象和表层形象内涵要素,通过标准化、统一化的视觉识别形象体系VI,展现给全社会公众,使社会公众产生一致的认同感,从而形成良好并且具鲜明个性特点的高校校园形象。V...

  2. 快乐的暑假生活作文

    篇一:快乐的暑假生活作文350字一个丰富多彩的暑假生活快要结束了,即将迎来二年级的学习生活。来自回想这个暑假,我感觉有很多收获,也感受到了无比的快乐……我按照暑期计划完成了很多任务。在学习方面,我预习了二年级的数学、语文。数学中背乘法口诀可不简单,刚开始背得很费劲,好在我每天都在坚持,最后熟能生巧,在“快算二十四”的扑克游戏中还战胜了妈妈!学习之余,我读了很多书,比如:《雷锋》、《小猪唏哩呼噜》、《神奇校车》、《三毛流浪记》、《小故事大智慧》、《少年奇才故事》、《少年博览》等等,还有一本让我着迷的《经典科...

  3. 关于聋校课程改革的思考

    关于改革聋校课程设置的思考焦作市特殊教育学校李陆军《聋校义务教育课程设置实验方案》关于聋校的培养目标是这样的:全面贯彻党的教育方针,体现时代要求,使聋生热爱祖国,热爱人民,热爱中国共产党;具有社会主义民主法制意识,遵守国家法律和社会公德;具有社会责任感,逐步形成正确的世界观、人生观、价值观,努力为人民服务;具有创新精神、实践能力、科学和人文素养以及环境意识;具有适应终身学习的基础知识、基本技能和方法;具有生活自理能力、社会适应能力和就业能力;具有健壮的体魄、良好的心理素质,养成健康的审美情趣和生活方式,培...

  4. 网架施工满堂脚手架方案

    网架施工满堂脚手架方案网架施工满堂脚手架方案一、编制依据1.1施工图纸1.2主要规范、规程建筑施工扣件式钢管脚手架安全技术规范JGJ30-2001建筑施工高处作业安全技术规范JGJ80-91建筑施工安全检查标准JGJ59-991.3施工组织设计1.4参考手册建筑施工手册简明施工计算手册实用建筑施工安全手册建筑工脚手架实用手册二、工程概况三、施工部署3.1安全防护领导小组安全生产、文明施工是企业生存与发展的前提条件,是达到无重大伤亡事故的必然保障,也是我项目部创建“文明现场”、“样板工地”的根本要求。为此项...

  5. 设计五大风格八大派别

    所有的室内装饰都有其特征,但这个特征又有明显的规律性和时代性,把一个时代的室内装饰特点以及规律性的精华提炼出来,在室内的各面造型及家具造型的表现形式,称之为室内装饰风格。中国有中国古典式的传统风格,西方有西方古典式的传统风格,每一种风格的形式与地理位置、民族特征、生活方式、文化潮流、风俗习惯、宗教信仰有密切关系,可称之为民族的文脉。装饰风格就是根据文脉结合时代的气息创造出各种室内环境和气氛。装饰风格是室内装饰设计的灵魂,是装饰的主旋律,而风格的主要种类分为:东方风格和西方风格。东方风格一般以有中国明清传统...

  6. [小故事大智慧]第十辑『亲情无边』

    第十辑『亲情无边』亲情,是我们人生中最珍贵和永不会消失的依靠!亲情,像一棵枝叶茂盛、绿意盎然的大树,它的每一个枝节,都饱含着爱的情愫。成功时,有亲情的祝愿;失意时,有亲情的安慰。亲情,总是出现在你最需要的时候,出现在为你遮风挡雨的时候……∮最可珍惜的感情◎卢卡斯一位母亲的儿子在战场上死了,消息传到母亲那里,她非常哀痛,祈祷主说:“要是我能再见到他,即使只见5分钟,我也心满意足。”这时天使出现了,对她说:“你可以见他5分钟。”母亲欢喜得眼泪流满双颊,急忙说:“快点,快点让我见他。”天使又说:“你的孩子是个大...

  7. 第二章第三节河流第一课时

    第三节河流教学设计第一课时一、设计思路:1、教材分析:《河流和湖泊》一节的课标要求是“在地图上找出我国的主要河流”,在把握课标,分析和处理教材时,我把本节的教学内容概括三个部分:(1)、在地图上找出流入太平洋、印度洋、北冰洋的主要河流和湖泊以及内流区的主要河湖。(2)、内、外流区的划分,内、外流区河流的水文特征。(3)、外流区内部南方和北方河流的差异。2、教学活动设计:针对课程标准的不同要求,根据本节三部分教学内容的不同特点,我设计了以下几个教学活动:活动1:在中国河流的空白图上,用彩色笔勾画出我国主要内...

  8. 东海岛资料

    东海岛东海岛位于广东省西南部的雷州半岛东部,是古雷州辖地。在今广东省湛江市区东南面,今属湛江市经济技术开发区管辖。以雷州方言、雷州音乐、雷歌雷剧、人龙舞等诸多文化内容为载体,铸就了“雷州文化”的组成部分。这里是中国“第五大岛”、广东省“第一大岛”。当地民俗、民居和方言都具有鲜明的“雷州文化”特色。是最具代表性的“雷州文化”地区之一,通用语言:雷州话。东海岛,位于湛江市区南部,北濒湛江港。北纬20°54′~21°08′,东经110°09′11″~110°33′22″。面积492平方公里,最长处32公里,最宽...

  9. 在爷爷七十岁生日宴会上的发言稿

    尊敬的爷爷奶奶、伯伯、叔叔、阿姨们,亲爱的兄弟姐妹们:大家上午好!今天是我敬爱的爷爷七十岁生日,我们大家怀着激动的心情欢聚一堂。首先请允许我代表全家,向各位亲朋好友致以最热烈的欢迎和最衷心的感谢!感谢你们百忙之中前来参加我爷爷的生日宴会。谢谢!(鞠躬)此时,我感到不胜荣幸,能在这里代表所有的晚辈向敬爱的爷爷送上最真诚、最温馨的祝福!爷爷,祝您生日快乐!(向爷爷鞠躬)爷爷,是您付出艰辛把我们子子孙孙养育成人,是您用成龙成凤的严爱供养子子孙孙读书成人。你走过风风雨雨七十年,给我们子子孙孙迎来了今天的幸福生活,...

  10. 实践科学发展观活动学习心得(党总支副书记)

    回顾改革开放三十年来我国经济社会发展取得的巨大成就,我们深刻认识到深入学习实践科学发展观是推进改革开放,加快发展的宝贵经验和成功之道。只有坚定不移地深入学习实践科学发展观,推进思想解放,才能与时俱进,勇于变革,勇于创新。结合我院工作实际,谈几点个人体会。一、要在解决矛盾中解放思想,促进科学发展。马克思主义的唯物辩证法认为,没有矛盾就没有世界,旧的矛盾解决了,新的矛盾又出现了。我们只有在解决矛盾中解放思想,才能不断创新建筑勘察设计工作。目前我院由于历史的原因形成的体制不顺,在一定程度上影响了我院的发展。一是...

  11. 小学语文三年级上册教学工作计划

    一、学生情况分析本班大部分学生学习兴趣浓厚,都能较熟练地掌握汉语拼音,能正确拼读音节,能借助拼音识字、阅读、学习普通话。能按汉字的笔画、笔顺、偏旁和结构分析识记字形,学习了一些字理识字的方法。初步学会结合词语理解词义,能运用学过的词语造句说话。能正确朗读课文,能认识自然段,认识句号、逗号、问号、叹号等标点符号,已学会写铅笔字,写字姿势基本正确。二、教材分析本册教材加强综合训练,突出重点,注重语言的感悟、积累和运用,注重基本技能的训练,从整体上提高学生的语文素养”,精选课文,减少课文类型,教材将课文分为8组...

  12. 开展富民送温暖活动总结

    按照中央、省、市、县有关北京奥运安保工作的总体部署和要求,以及xx镇党委、镇政府关于开展“兴边富民送温暖”活动实施方案的安排,我局工作队员xx同志和xx同志于xx年7月28日下午,及时深入到马散村单位扶贫挂钩联系点,于xx年7月29日上午,县、镇、村工作组召集全村党员、村组干部,召开“兴边富民送温暖”活动启动会议,这次参加开展“兴边富民送温暖”活动的工作队员有县档案局2人、县便民中心2人、镇工作组7人、共有11人组成,根据马散村实际,工作组分成两片管理,做到组组有工作组人员驻扎在村小组上,我局工作队员被安...

  13. 加强作风建设促进廉洁从政个人总结

    在县局开展的加强作风建设促进廉洁从政主题教育活动以来,进一步增强了广大党员干部廉洁从政的意识,促进了党风廉政建设的有效深入开展。现将参加活动以来个人的开展情况、存在问题及整改措施小结如下:一、活动开展以来的学习活动情况:学习了:市、县纪委关于利用明察暗访开展机关作风建设警示教育;中纪委关于严格禁止利用职务上的便利谋取不正当利益的若干规定;胡锦涛总书记在中纪委七次全会上的重要讲话;温家宝总理在国务院第五次廉政工作会议上的重要讲话;吴官司正在中央纪委七次全会上的工作报告;省第八次党代会精神和省纪委第二次全会精...

  14. 石化实习总结报告

    从今年7月末开始到八月初,我在吉林化工有机合成厂进行实习。实习期间,我在老师、工人们的热心关怀和悉心指导下,主动了解吉林石化有机合成厂各个车间的工艺流程以及所作工作,注意把书本上学到的相关理论知识与生产相结合,深入理解。用理论加深对实践的感性认识,用实践来验证理论知识的准确性,积极探求化工工艺的本质与规律。实习生活,满含着紧张和新奇,更从中收获了丰硕的成果。我所实习的吉林化工有机合成厂,坐落在景色秀丽的龙潭山西麓,风光旖旎的松花江北岸,是一家大型石油化工企业。吉化有机合成厂是国家“六五”期间投资兴建的大型...

  15. 副县长述职报告

    我从2005年10月起负责城建口工作。两年来,按照县委、县政府的总体部署,与分管部门一道,攻坚克难,真抓实干,较好地完成了各项工作任务。现将两年来的思想工作情况报告如下,请评议。一、履行职责情况(一)城乡建设工作。自分管城乡建设工作以来,坚持深入调研,认真分析城乡建设发展现状,努力运用经营城市理念调整工作思路、强化工作重点,借助市场力量加快城市发展步伐。--基础设施进一步完善。通过多渠道筹集资金,加快了基础设施建设。一是从2006年7月开始收取城市基础设施配套费,并将其作为城市建设资金投入的重要来源。二是...

  16. 毕业鉴定表自我鉴定

    班委的评价:该同学在校期间遵纪守法;学习勤奋,有钻研精神,专业知识扎实,有一定的英语知识基础,知识面较宽;担任班干部期间,对工作积极,责任心强,有较强的组织协调能力,注重理论联系实际,积极参加社会实践活动,团结同学,乐于助人,生活节俭,作风正派。对一般同学:该同学在校期间自觉遵守学校各项规章制度;学习刻苦,掌握了相关的专业知识,有一定的英语知识基础,兴趣爱好广泛,注重理论联系实际,积极参加社会实践活动,具有较强的管理协调能力和交际能力,个性活法,有亲和力。对入党了同学:该同学在本科学习阶段,思想上积极要求...

  17. qq游戏英雄杀皮肤的话

    秦始皇-嬴政集权:合纵连横,天下归一。汉高祖-刘邦驭人:帝王之道,审时度势,物尽其用!阵亡:大风起兮云飞扬,只叹今昔要离常成吉思汗-铁木真强掠:出阵!!!宋太祖-赵匡胤释权:普天之下,莫非王土!越王-勾践:隐忍:小不忍则乱大谋。图强:闪(和原来一样,没有变化)唐太宗-李世民:控局:天下大事,尽为掌握。明太祖-朱元璋:强运:大运昌隆,无道不公。巾国英雄-花木兰迷离:可恶!易装:安能辨我是雄雌!阵亡:只叹木兰终是女儿身!天狼星-杨延昭天狼:拥旌一怒千军骇,瞋目三关万马嘶!混世魔王-程咬金:三板斧:吾乃混世魔王...

  18. 担保公司各部门岗位职责_整全

    **融昌担保有限公司岗位职责为提高工作效率明确各岗位责任特制订以下岗位职责。总经理一、组织落实公司董事会制定的中长期发展战略、公司企业文化建设的总体规划。审批公司每笔业务对公司的每笔业务负总责;二、按照公司章程的规定,组织建立健全公司管理体系;三、建立和完善公司管理制度并组织实施,制定公司高级管理人员职责和部门职能;四、负责综合办公室的行政管理工作,贯彻公司工作方针、目标;五、负责协调各部门的关系,监督检查规章制度的执行情况,了解工作目标和工作任务完成情况和工作进度,催办、督办公司董事会、办公会、公司领导...

  19. 唱给红军妈妈的歌--今天是烈士纪念日

    作者:心路驿站心路驿站《唱给红军妈妈的歌》《大爱齐天》  作者:退思斋主有你的草鞋走过,山路也平坦,有你的歌声飘过,野花也鲜艳。有你的双手捧过,泉水更清凌,有你的目光掠过,高天更蔚蓝。有你的指尖抚慰,石崖也温暖,有你的亲口咀嚼,草根也甘甜。有你的乳汁哺育,冰雪更圣洁,有你的鲜血涂染,大地更灿烂。红军妈妈呵,儿女们在呼唤,远去的一颗爱心将红烛点燃。世上的爱有千万种,千万种,这就是大爱齐天,大爱齐天。《我吟我歌》作者:心路驿站你穿过的草鞋啊,故事那么多。你唱过的歌谣啊,永存我心窝。你温暖的...

  20. 社会认同原理

    目录[隐藏]1什么是社会认同原理2社会认同原理的事例3相关条目[编辑]什么是社会认同原理社会认同原理指人们经常依靠其他人的行为来决定自己应该怎么做,人们乐于参照相似人的行为。我们会经常看到这样的新闻报道:某某时间某某街道,某某受害者正遭受某某强盗的迫害,周围有数百人观看,但是都无动于衷,连一个电话都不肯帮忙拨打…这样的新闻一出来,我们大多数人的第一反应会是“现在的人真冷漠”,所有的媒体也会用同一个标题:城市人都变冷漠了吗?没错,我们都认为人们是变冷漠了。然而,有研究却表明:类似此种情况,若是只有一个旁观者...