C#中,子线程与主线程之间的通信是如何实现(转)
注: 项目中按照这个方法调试成功;
通常我们会有这种需求:
一个支持慢速设备的处理类,如网络通信、串口通信、打印等
此时经常需要将线程封装在类里面,让类支持异步处理,然后发布事件或者回调委托通知主线程
因为类需要被封装好,对外线程是不可见的,同时类的内部也只有事件,并不涉及界面,此时Control的BeginInvoke已经无能为力了。此时我更钟情于SynchronizationContext对象,简单明了
假设我设计一个类TestClient,有个Connected事件
class TestClient { private Thread workThread; private SynchronizationContext mainThreadSynContext;
public TestClient()//构造函数当然是主线程执行的 { mainThreadSynContext = SynchronizationContext.Current; //在这里记录主线程的上下文 workThread = new Thread(new ThreadStart(DoWork));//创建一个新的线程 }
private void OnConnected(object state)//由于是主线程的同步对象Post调用,这个是在主线程中执行的 { //这里就回到了主线程里面了 //做一些事情 }
private void DoWork()//这个是workThread线程执行的 { //这儿做些事(连接什么的。。。)
//这而干完了
mainThreadSynContext.Post(new SendOrPostCallback(OnConnected), null);//通知主线程 } } --------------------- 作者:HonorDuan 来源:CSDN 原文:https://blog.csdn.net/qq_23127851/article/details/78270988 版权声明:本文为博主原创文章,转载请附上博文链接!
https://bbs.csdn.net/topics/210063471
C#中,子线程与主线程之间的通信是如何实现(转)的更多相关文章
- WinForm 中使用 Action 子线程对主线程 控制进行访问
/// <summary> /// 开启新线程执行 /// </summary> /// <param name="sender"></p ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- Qt自己定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- c# 子线程与主线程通信二
之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步 基本步骤 1.定义类 using System; using System.Collections.Gen ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- C#中Invoke的用法()-解决子线程访问主线程控件、线程安全等问题
引自https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概 ...
- 19 Handler 子线程向主线程发送信息
案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...
- C# 子线程与主线程通讯方法一
最近在项目中要用到子线程运行结束向主线程通知的需求,利用线程上下文来实现线程之间的同步. 子线程结束后调用同步函数,向主线程发送时间字符串,改变主窗体的label标签 label标签改变事件触发处理函 ...
- Unity3d 创建线程 子线程与主线程通信
创建子线程 一,不带参数 Thread resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...
随机推荐
- cookies插件 , axios插件,element-ui 插件
vue-cookie插件 安装 >: cnpm install vue-cookies main.js配置 // 第一种方式 import cookies from 'vue-cookies' ...
- Python凯撒密码和括号匹配
1.凯撒密码: 除了特殊字符不转化,其余的按照规定经行转译,以下以a~z和A~Z的字符都进行转译. plaincode = input("")print(len(plaincode ...
- Djiango权限组件
一. login中注册 权限url def login(request): if request.method == "POST": username = request.POST ...
- java发送邮件javamail, freemarker读取html模板内容
https://www.cnblogs.com/xdp-gacl/p/4216311.html 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件 ...
- 集合(Collection)类
集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. ...
- Tomcat 部署多个web项目
1.若Tomcat的端口设置为10000,则http://localhost:10000访问的目录是 webapps 2.Service.xml中host内配置Context标签,path+docba ...
- luogu 2592 区间dp
\(f_{i, j, a, b}\) 表示当前一共有 \(i\) 人排队, \(j\) 名男生,男生数目 - 女生数目为 \(a\), 女生数目 - 男生数目为 \(b\),\(a, b >= ...
- Open Judge 1.4 09
09:判断能否被3,5,7整除 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个整数,判断它能否被3,5,7整除,并输出以下信息:1.能同时被3,5,7整除(直接输出3 5 ...
- 内核中PID_HANDLE_OBJECT等互相转换
目录 一丶简介 1.进程pid 转化为 HANDLE 2.Handle --------> 转化为 PID 3.Pid ------> Object(EPROCESS) 4. HANDLE ...
- FCS省选模拟赛 Day1
Description Solution T1 shopping 目测是插板法乱搞一下 发现题解写的是容斥dp: \[ ans = \sum_i (-1)^ig[i] \] \(g[i]\)表示的有 ...