zoukankan      html  css  js  c++  java
  • 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());

            }

  • 相关阅读:
    HTTP客户端识别与Cookie机制
    javascript模式之模块模式
    js类式继承模式学习心得
    关于html自闭合标签要不要加空格和斜杠的问题?
    分享两件有趣的事情
    PS Web切图界面设置
    这是什么
    关于前后端分离我的理解
    模块化方案esl以及amd的依赖方式
    node 内存管理相关
  • 原文地址:https://www.cnblogs.com/xihong2014/p/11005601.html
Copyright © 2011-2022 走看看