C#通过接口与线程通信(捕获线程状态)介绍

摘要:本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考。

提示:本文所提到的线程状态变化,并不是指线程启动、暂停、停止,而是说线程内部状态的迁移。随着软件技术不断发展,用户需求不断提升,多线程的重要性日益凸显。

关于线程,通俗的讲,每当启动一个exe应用程序,都会创建一个进程和一个主线程,主线程用来处理界面绘制、界面事件响应等工作,而进程则是线程的容器,主线程和用户创建的新线程,都将在相应的进程中维护。由此可知,一个程序之所以能工作,是线程的功劳,进程仅仅是容器而已,一旦程序的主线程被阻塞,就会造成界面无响应等现象,这时候就要用多线程解决问题。然而,在程序中使用多线程,是比较头疼的一件事。以我的体会,多线程首先会造成程序不稳定,处理不好容易导致程序崩溃。其次,多线程控制并不是那么容易,比如线程状态监控、线程访问冲突等等。最后,还有一个线程通信问题,线程和线程之间的数据交互、消息通知等,并不是那么容易,往往涉及高级知识,比如委托。很多情况下,我们希望能获得线程的“返回值”,也就是能够获得线程中的数据,当线程内部状态发生改变时,我们能及时获取关键数据,来进行不同的处理。遗憾的是,线程是没有返回值的,在线程中运行的方法,返回值必须是void,但可以有参数。本文就从这个角度出发,通过一个简单的小技巧,及时捕获线程状态变化,并且获得关键数据。

思路如下图:

简单的解释一下,核心思想:通过定义接口,来规范线程参数,当线程内部状态迁移时,调用接口中定义的对应处理方法,达到捕获线程状态的目的,同时也能获得线程内部关键数据。

代码实现如下:

winform窗体中的代码(对应线程相关类):

using System.Threading;///罗旭成
///2013-11-14
/// <summary>/// 响应开始按钮单击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){//实例化ThreadNotice类对象,ThreadNotice类实现了IThreadNotice接口IThreadNotice tn = new ThreadNotice();//实例化一个Thread对象,并且指定该Thread对象执行Run方法Thread th = new Thread(Run);//启动线程,并且传入线程方法(Run)需要的一个参数//注意,这里最多能传入一个参数!!并且要求线程方法的参数为Object类型!! th.Start(tn);}//线程中运行的方法void Run(Object obj) {//将对象转换成接口类型IThreadNotice tn = (IThreadNotice)obj;//假设状态为1,则调用实现IThreadNotice接口类的状态1处理方法,并传入状态1下的数据tn.ThreadEvent1("状态1");//假设为状态2,则调用实现IThreadNotice接口类的状态2处理方法,并传入状态2下的数据tn.ThreadEvent2("状态2");}

线程状态处理接口:

///罗旭成
///2013-11-14
//
线程状态通知接口public interface IThreadNotice{//状态1处理方法void ThreadEvent1(string msg);//状态2处理方法void ThreadEvent2(string msg);}

状态处理类:

using System.Diagnostics;///罗旭成
///2013-11-14
//ThreadNotice类实现了IThreadNotice接口public class ThreadNotice:IThreadNotice{//ThreadNotice类对于状态1的处理public void ThreadEvent1(string msg){Debug.WriteLine("ThreadNotice类处理——" + msg);}//ThreadNotice类对于状态2的处理public void ThreadEvent2(string msg){Debug.WriteLine("ThreadNotice类处理——" + msg);}}

效果图:

相信大家已经看出,此方法只能达到捕获、处理线程状态的效果,并不能把线程中的数据返回。也就是说,虽然我们捕获了线程状态,获取了关键数据,但这仍然是一种向下的深层调用,并没有向上层返回。比如,做不到把线程中的数据显示在界面上,那将用到委托技术。

 

转载于:https://www.cnblogs.com/jara/p/3424150.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 类文件加载 Autoloader

做习惯了编译语言&#xff0c;转到php 使用 php的面向对象开发时候遇见一个挺别扭的问题。在Php中引入对象 后 在调用过程中还需要将对象所在的php文件 require 到当前php文件 目前代码结构 index.php <?phpuse model\BookModel;include_once __DIR__./autoloader.php; Aut…

【MSP430G2553】图形化开发笔记(4) Timer_A 定时器

目录概述Timer_A 模块16 位主定时器连续计数模式增计数模式增减计数模式主定时器的一般设置捕获/比较模块 CCRx捕获模块比较模块小结Grace中配置Timer_ATimer0_A3 - Overview介绍用例&#xff1a;定时器的启动/停止用例&#xff1a;使用定时器比较模式产生周期性间隔用例&#…

flask学习笔记--蓝图

https://blog.csdn.net/m0_37519490/article/details/80627601 初学者建议看 https://www.cnblogs.com/jackadam/p/8684148.html

前端UI框架《Angulr》入门

Angulr 项目的名称为 Angulr&#xff0c;对&#xff01;没错&#xff01;就是少个 a&#xff0c;少个 a 就是它正确的拼写。 是一个以 Bootstrap 和 AngularJS 为基础&#xff0c;并使用了大量前端开源组件合成的一个前端UI框架&#xff0c;是非常棒的UI框架。 今天就来和大家讲…

比赛一买香蕉问题---解题报告

买香蕉问题 题目大意&#xff1a; 士兵想买W个香蕉。买第一个香蕉K美元&#xff0c;第二个2K美元&#xff0c;以此类推&#xff0c;第i 个香蕉iK美元。 现在该士兵有n美元&#xff0c;而他想买W个香蕉&#xff0c;他需要向他的朋友借多少美元&#xff1f; 要求&#xff1a; 输入…

Flask使用Flask-SQLAlchemy操作MySQL数据库

https://www.jianshu.com/p/6ae0d30a5539 前言&#xff1a; Flask-SQLAlchemy是一个Flask扩展&#xff0c;简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架&#xff0c;支持多种数据库后台。SQLAlchemy提供了高层ORM&#xff0c;也提供了…

会计基础模拟练习一(3)

会计基础模拟练习一&#xff08;3&#xff09; 下周一18号会计从业资格考试就要报名了,本人重点看的是会计基础和会计电算化,做了一下测试题,五十多分,较之前有了一些长进.很多之前重点复习的章节有了明显的提升,像后面的几章没怎么看,出错的概率就大大的提升了. 我觉得这个考试…

[2017-08-31]如何使用ruby同步markdown博文到博客园

这两天折腾了一下用ruby通过MetaWeblog接口把本博客同步到博客园&#xff0c;特此记录。 MetaWeblog MetaWeblog是一个专门关于博客的协议标准&#xff0c;通过xmlrpc&#xff0c;很简单的定义了新增、编辑、删除三个基本接口。 在博客园设置页签的最下方&#xff0c;保存按钮之…

MacOS中Dock栏的设置和使用技巧,新手必看

MacOS中Dock栏的设置和使用技巧&#xff0c;新手必看 Dock栏就是Mac放置常用应用程序和文件夹快捷方式的任务栏&#xff0c;为你访问这个应用和文件提供了非常方便的入口。 作为Mac用户最常使用的区域&#xff0c;要知道如何才能更高效的使用它&#xff0c;从而达到事半功倍的…

ldconfig deferred processing now taking place

在ubuntu下面安装软件&#xff0c;安装结束后&#xff0c;提示&#xff1a;ldconfig deferred processing now taking place 到网上查询了一下&#xff0c;大概意思是说&#xff1a;软件安装完了&#xff0c;是否要重启电脑。转载于:https://www.cnblogs.com/wangkongming/p/…

51Nod 1003 阶乘后面0的数量 | 思维

题意&#xff1a;n的阶乘后面0的个数&#xff0c;如果直接算出阶乘再数0的数量一定会超时的。因为102*5,所以求出5贡献的次数就行。#include "bits/stdc.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 510 …

史上超详细的flask_sqlalchemy连接mysql数据库

https://www.jianshu.com/p/1ba45bd6c351 PythonFlask安装&#xff1a;https://www.jianshu.com/p/cd1925e90eda Flask路径参数以及请求参数讲解&#xff1a;https://www.jianshu.com/p/54057b4f0437 首先安装pymysql&#xff0c;命令如下&#xff1a;pip install pymysql 安装…

中国移动技术愿景2020+

2019独角兽企业重金招聘Python工程师标准>>> 中国移动技术愿景2020 本文档白皮书是中国移动提出的在2020年及其之后的若干年内对产业各方面技术发展的构想&#xff0c;包括行业发展趋势&#xff0c;面向万物的数字化服务和对技术发展的看法。希望产业各方面能够开展…

jQuery对象与dom对象的转换

jQuery对象与dom对象的转换只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的&#xff0c;调用方法时要注意操作的是dom对象还是 jquery对象。普通的dom对象一般可以通过$()转换成jquery对象。如&#xff1a;$(document.getElementByIdx_x("msg…

用sqlalchemy对mysql数据库增删改查demo

首先要搭建mysql服务器、安装mysql python驱动、安装sqlalchemy包&#xff0c; 我用的是windows环境&#xff0c;安装参考&#xff1a;https://blog.csdn.net/jishuwenming/article/details/80993840 完整demo 如下&#xff1a; --------------------- 作者&#xff1a;jishuw…

《计算机程序设计艺术》pdf

下载地址&#xff1a;网盘下载 内容简介 编辑本书作者D. E. Knuth是在计算机学界十分著名的学者&#xff0c;在本领域享有很高权威和盛名&#xff0c;他的这部著作是无数计算机专业人员的学习教材和参考读物&#xff0c;也是许多专业研究工作者经常阅读的经典。本书已被翻译为几…

Jsoup 抓取和数据页 认识HTTP头

推荐一本书&#xff1a;黑客攻防技术宝典.Web实战篇 &#xff1b; 顺便留下一个疑问&#xff1a;能否通过jsoup大量并发訪问web或者小型域名server&#xff0c;使其瘫痪&#xff1f;其有用jsoup熟悉的朋友能够用它解析url来干一件非常无耻的事&#xff08;源代码保密&#xff…

杭电划分问题

在做杭电做题时遇到好几个有关划分的题目&#xff0c;比如2050 折线分割平面、1290的献给母校的蛋糕&#xff0c;都是数学问题吧&#xff0c;感觉挺有做数学题的感觉的&#xff0c;在这里总结一下。 1、n个点最多把直线分成1n份&#xff0c;这个很好理解 2、n条直线最多把平面分…

flask + 蓝图 用 sqlalchemy 对 mysql 进行 增删查改 的 demo

main.py import uuid # UUID: 通用唯一标识符 # from flask import Flask from flask import Flask, request, json, Response from flask_sqlalchemy import SQLAlchemyfrom app.main.views import * from app.app01.views import * from app.app02.views import * from a…

UVA - 400 Unix ls

/*收获&#xff1a;1. 我觉得最大的收获是&#xff0c;了解了该怎么进行竖向的数据输出并且&#xff0c;以及《入门经典》的做法&#xff0c;并没有先转换为二维数组再输出&#xff0c;而是用了些别的技巧(好像也能算是技巧&#xff0c;具体的看代码吧&#xff0c;这个我也不太…