c# 子线程与主线程通信二
之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步
基本步骤
1、定义类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DX_equip.Class
{
/// <summary>
/// 定义一个信息委托
/// </summary>
/// <param name="sender">发布者</param>
/// <param name="msg">发送内容</param>
public delegate void DxMsgDlg(object sender,object msg);
public class DxMessageHelper
{
/// <summary>
/// 消息发送事件
/// </summary>
public static event DxMsgDlg EventSend;
public static void DxSendMessage(object sender, object msg)
{
if (EventSend != null)//
{
EventSend(sender, msg);
}
}
}
}
2、在子线程中发送事件,实现事件通知功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Xml;
using System.Data;
using System.Windows.Forms;
namespace DX_equip.Class
{
public class WebServiceConnect
{
private static bool circle = false;
private static Thread taskThread;
public static string getTaskMsg = "";
public static int connCount = 0;
private static SynchronizationContext mainThreadSynContext;
public static void GetTaskInfo(string taskInfoIn0)
{
mainThreadSynContext = SynchronizationContext.Current;
taskThread = new Thread(new ParameterizedThreadStart(webConnect));
taskThread.Start(taskInfoIn0);
}
public static void webConnect(object taskInfoIn)
{
getTaskMsg = "";
try
{
string taskInfoIn0 = taskInfoIn.ToString();
TestWebReference.TDMTestTaskInterfaceServiceService taskInfoService = new TestWebReference.TDMTestTaskInterfaceServiceService();
string taskName = SystemInfoClass.systemBaseInfo.taskName;
getTaskMsg = taskInfoService.queryTaskInfo(taskInfoIn0, taskName);
StackTrace st = new StackTrace();
string callName = st.GetFrame(1).GetMethod().Name;
DxMessageHelper.DxSendMessage(callName,getTaskMsg);
}
catch (Exception ex)
{
System.Net.WebException wex = ex as System.Net.WebException;
System.Windows.Forms.MessageBox.Show("通ª¡§讯?未¡ä连¢?接¨®!ê?");
}
}
3、接收事件函数中注册事件
public MainForm()
{
InitializeComponent();
DxMessageHelper.EventSend += new DxMsgDlg(Receive_DxEventSend);
}
private void Receive_DxEventSend(object sender, object msg)
{
this.Invoke(new Action(() =>
{
labTaskMsg.Visible = true;
labTaskMsg.Text = msg.ToString();
}));
Trace.WriteLine("***Info*** " + msg.ToString());
}
c# 子线程与主线程通信二的更多相关文章
- Unity3d 创建线程 子线程与主线程通信
创建子线程 一,不带参数 Thread resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- WinForm 中使用 Action 子线程对主线程 控制进行访问
/// <summary> /// 开启新线程执行 /// </summary> /// <param name="sender"></p ...
- Qt自己定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- 19 Handler 子线程向主线程发送信息
案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...
- C# 子线程与主线程通讯方法一
最近在项目中要用到子线程运行结束向主线程通知的需求,利用线程上下文来实现线程之间的同步. 子线程结束后调用同步函数,向主线程发送时间字符串,改变主窗体的label标签 label标签改变事件触发处理函 ...
- C# 子线程调用主线程窗体的解决方法
摘自其他人博客,自己试过确实解决问题.(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value ...
- Android中,子线程使用主线程中的组件出现问题的解决方法
Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...
随机推荐
- CSP-J总结&题解
总结: 这一次,最后一次,还是不行啊. 文件操作方面:没有FCLOSE,血的教训. 考场复盘: 首先一二题没什么好讲的,秒切.但是第三题由于一开始看出来是完全背包,但是好像又不是,去年又有摆渡车阴影, ...
- 洛谷 4290 [HAOI2008]玩具取名 题解
P4290 [HAOI2008]玩具取名 题目描述 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用&qu ...
- lixuxmint系统定制与配置(5)-效率配置
小书匠Linux 目录: 1.zsh安装与配置 1.1 安装 1.1.1 检查当前的终端类型 1.1.2 安装zsh 1.2 美化zsh 1.3 配置zsh 1.3.1 别名设置 2.自动登录服务器 ...
- HDU-盐水的故事
http://acm.hdu.edu.cn/showproblem.php?pid=1408 这是一道高精度问题: 在自己错了数十遍之后找到了不少规律: 首先是Output limit exceede ...
- UOJ422. 【集训队作业2018】小Z的礼物 [min-max容斥,插头DP]
UOJ 思路 由于没有代码和AC记录的支撑,以下思路可能有错. 看到全部取完,大概可以想到min-max容斥. 由于期望的表达式里面合法方案的个数是在分母里面的,所以可以想到把它记录在状态里. 然而由 ...
- linux线程操作
初始化条件变量 int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr); 函数返回值:返回0表示成功,返回其他表示失败. ...
- python 链表的反转
code #!/usr/bin/python # -*- coding: utf- -*- class ListNode: def __init__(self,x): self.val=x self. ...
- 线程池(4)-参数-RejectedExecutionHandler
1.介绍 当线程池线程数大于最大线程数(maximumPoolSize)时,多余的任务,程序应该按照什么拒绝策略处理. 2.拒绝策略4个 AbortPolicy:丢弃任务,并抛出RejectedExe ...
- 5.lock 锁
中断: 线程实例.interrupt(); lock锁的使用 package com.jlong; import java.util.concurrent.locks.Condition; imp ...
- web 安全登录算法
摘自:http://hi.baidu.com/weiqi228/blog/item/922e961bbcc2c0188618bfb5.html 对于 Web 应用程序,安全登录是很重要的.但是目前大多 ...