之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步

基本步骤

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# 子线程与主线程通信二的更多相关文章

  1. Unity3d 创建线程 子线程与主线程通信

    创建子线程 一,不带参数 Thread   resourcesLoadThread=new Thread (this.resourceLoadTxt); resourcesLoadThread.Sta ...

  2. [转]QT子线程与主线程的信号槽通信-亲测可用!

    近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...

  3. WinForm 中使用 Action 子线程对主线程 控制进行访问

    /// <summary> /// 开启新线程执行 /// </summary> /// <param name="sender"></p ...

  4. Qt自己定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  5. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...

  6. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1; import android.os.Bundle; import android ...

  7. C# 子线程与主线程通讯方法一

    最近在项目中要用到子线程运行结束向主线程通知的需求,利用线程上下文来实现线程之间的同步. 子线程结束后调用同步函数,向主线程发送时间字符串,改变主窗体的label标签 label标签改变事件触发处理函 ...

  8. C# 子线程调用主线程窗体的解决方法

    摘自其他人博客,自己试过确实解决问题.(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value ...

  9. Android中,子线程使用主线程中的组件出现问题的解决方法

    Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...

随机推荐

  1. RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net

    SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...

  2. vue路由机制导致的坑,坑,坑

    实现一个手机定位的功能: 跳转到指定页面的时候,安卓手机地图定位正常,苹果手机第一次进入页面,地图定位不准, 要刷新后,才可以准确定位,后来无意间不用路由跳转,使用JS跳转,完美解决, 特此记录,方便 ...

  3. 双向认证下rpc-gateway使用(同时提供rpc和http服务)

    下载go get -v github.com/grpc-ecosystem/grpc-gateway,然后把这个包下面的third-party下面的google文件夹拷贝到Prod.proto的同级目 ...

  4. (转载) 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    安装完之后别忘了还需要安装SSMS,这是坑爹的地方之二,干嘛不集成到SQL Server安装包里还要用户自己单独下载 下载地址:https://msdn.microsoft.com/en-us/lib ...

  5. 汇编知识之EIP寄存器

    eip寄存器存储着我们cpu要读取指令的地址,没有了它,cpu就无法读取下面的指令(通俗点讲cpu就无法执行.每次相应汇编指令执行完相应的eip值就会增加. 因为80386 cpu的寻址范围是4GB. ...

  6. 游戏 DP

    游戏 DP [题意描述] 小喵喵喜欢玩 RPG 游戏.在这款游戏中,玩家有两个属性,攻击和防御,现在小喵喵的攻击和防御都是 1,接下来小喵喵会依次遇到 n 个事件.事件有两种. 1.小喵喵经过修炼,角 ...

  7. Windows下 Python 2 与 Python 3 共存

    转自:http://lovenight.github.io/2016/09/27/Windows%E4%B8%8B-Python-2-%E4%B8%8E-Python-3-%E5%85%B1%E5%A ...

  8. 谈下python的GIL

    GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其 ...

  9. Vue axios post 传参数,后台接收不到为 null

    由于axios默认发送数据时,数据格式是Request Payload,而并非我们常用的Form Data格式,后端未必能正常获取到,所以在发送之前,需要使用qs模块对其进行处理. cnmp inst ...

  10. Perl字符贪吃蛇

    一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...