`
sodart
  • 浏览: 28143 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个C#线程间通讯的小例子

阅读更多

先看以下代码:

using System;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace 线程间通讯
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //1.创建Invoke函数,大致如下:
        /// <summary>
        /// Delegate function to be invoked by main thread
        /// </summary>
        private void InvokeFun()
        {
            if (prgBar.Value < 100)
            {
                prgBar.Value = prgBar.Value + 1;
                button1.Text = prgBar.Value.ToString();
            }
            if (prgBar.Value == 100)
            {
                MessageBox.Show("完成", this.Text);
                prgBar.Value = 0;
            }
        }

        //2.子线程入口函数:
        /// <summary>
        /// Thread function interface
        /// </summary>
        private void ThreadFun()
        {
            //Create invoke method by specific function
           MethodInvoker mi = new MethodInvoker( this.InvokeFun );
            for( int i = 0; i < 100; i++ )
            {
               this.BeginInvoke( mi );//让主线程去访问自己创建的控件.
                Thread.Sleep( 100 );//在新的线程上执行耗时操作.
            }
        }

        //3. Begin from here
        private void button1_Click(object sender, EventArgs e)
        {         
            Thread thdProcess = new Thread(new ThreadStart(ThreadFun));
            thdProcess.Start();

        }
    }
}

在不做处理的情况下,如果子线程访问由主线程创建的控件时,系统都会报错,告诉我们线程间不能直接调用.因为不同的线程是在不同的内存空间中各自无干扰的并行运行着的.那么要怎么做才能让在子线程中访问到想要访问的控件呢?

其实,从上面的例子中可以看出,实现线程间通讯其实并不复杂.thdProcess.Start()以后,开始了一个新的线程,这个线程从入口函数ThreadFun()开始.下面就是问题的关键了:

代码中用到了MethodInvoker 委托,在MSDN中是这样描述它的:该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法,在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。在这里它实际上就代表了InvokeFun()方法.
另一个重要的方法:BeginInvoke(Delegate) ,它表示在创建控件的基础句柄所在线程上异步执行指定委托。它可异步调用委托并且此方法立即返回。可以从任何线程(甚至包括拥有该控件句柄的线程)调用此方法。如果控件句柄尚不存在,则此方法沿控件的父级链搜索,直到它找到有窗口句柄的控件或窗体为止。这里就是通过这个异步调用来完成子线程对主线程上相应控件的访问的.

回头想想,是不是很简单的三步:创建并开始线程->指定委托方法->异步调用.

分享到:
评论

相关推荐

    C# socket多线程通讯 含客户端

    本资源“C# socket多线程通讯 含客户端”提供了一个实例,用于演示如何在C#中使用Socket进行多线程通信,这对于理解和掌握网络编程具有很高的价值。 1. **Socket基础** Socket在C#中被封装在System.Net.Sockets...

    多线程完整(C#),综合概念与例子,详细讲述多线程的运用

    多线程允许一个程序同时执行多个不同的任务,从而提高了应用程序的效率和响应性。以下将详细介绍标题和描述中提到的多线程相关知识点。 1. **多线程的概念**: 多线程是指在一个进程中同时运行多个独立的执行序列...

    C#的多线程机制探索

    多线程是指在一个应用程序中同时运行多个执行流,每个执行流被称为一个线程。线程是操作系统调度的基本单位,它共享同一进程的资源,如内存和文件句柄。通过多线程,程序可以并行执行不同的任务,提高系统的效率和...

    C#多线程通讯[归类].pdf

    在上述的示例中,我们看到了一个简单模拟的多线程通讯场景,通过类和线程的使用来演示如何在不同线程间传递工作状态。 首先,我们有一个`老板`类,它是整个程序的协调者。`老板`类有两个主要的成员变量:`电话总机...

    C#线程通信

    在C#编程中,多线程是提升程序执行效率的重要手段。然而,由于Windows应用程序的UI(用户界面)线程与后台工作线程之间存在线程隔离,直接在非UI线程上操作UI控件可能会导致异常。为了解决这个问题,C#提供了线程...

    C#Socket通讯超清晰例子(带线程间访问)

    下面我们将详细讲解C# Socket通信的关键知识点,并提供一个简单的示例。 1. **Socket类与NetworkStream类**: C#中的`System.Net.Sockets.Socket`类是进行网络通信的核心。它提供了TCP和UDP两种传输层协议的接口。...

    C#与Twincat 通讯例子

    以下是一个基本的C#代码示例,展示如何创建连接并读取一个变量: ```csharp using TwinCAT.Ads; // 创建ADS客户端对象 var client = new AdsClient(); try { // 连接到本地TwinCAT PLC (IP地址默认为127.0.0.1) ...

    AGSXMPP即时通讯C#例子

    AGSXMPP是一个开源的XMPP(Extensible Messaging and Presence Protocol)库,它允许开发者创建支持即时通讯(IM)和在线状态(Presence)的应用。在C#编程环境中,AGSXMPP提供了一套完整的API,使得开发人员可以...

    c# UDP通讯例子

    综上所述,这个"C# UDP通讯例子"是关于如何在WPF应用程序中使用C#的UdpClient类进行UDP通信的一个实践案例。通过创建UdpClient对象、发送和接收数据报,以及在WPF界面中展示通信结果,我们可以构建出一个基础的UDP...

    c#非常全面串口通讯例子

    1. **SerialPort类**:C#中的System.IO.Ports命名空间提供了一个名为SerialPort的类,它封装了与物理串行端口进行通信所需的全部功能。开发者可以使用这个类来打开、关闭串口,设置波特率、数据位、停止位、校验位等...

    C# TCP/IP通信小例子

    本示例"**C# TCP/IP通信小例子**"是一个基础教程,旨在帮助新手理解如何在C#中实现TCP/IP通信。 TCP(传输控制协议)和IP(因特网协议)是Internet上最基础的通信协议,TCP负责确保数据的可靠传输,而IP则处理...

    c# 基于PC 串口通讯- 与下位机通讯死机bug修复

    综上所述,通过正确设置C#的SerialPort类,使用定时器监控数据,强化异常处理和资源管理,我们可以构建一个稳定的串口通讯程序,有效避免与下位机通讯时出现的死机问题。同时,对下位机的通讯协议、硬件状态以及程序...

    C#通过Fins命令读写Omron PLC实例源码

    在这个例子中,我们创建了一个`FinsClient`对象,连接到PLC,然后发送一个读取D0寄存器的FINS命令。成功读取数据后,我们将其转换为整数值并打印出来。如果遇到错误,我们会捕获并输出错误信息。 写入PLC的操作类似...

    C# 3.0 socket通讯程序例子

    C# 3.0作为.NET Framework的一个版本,提供了强大的Socket类库,使得开发者能够构建高效、可靠的网络通信应用程序。本篇文章将深入探讨C# 3.0中Socket通信的相关知识点,并结合提供的"服务器端"和"客户端"程序例子...

    C#使用usb通讯libusbdotnet

    在C#编程环境中,USB通信是一个常见的需求,用于与各种硬件设备进行数据交换。`libusbdotnet`是一个开源库,它为.NET开发者提供了一种简单的方式与USB设备进行交互。这个库允许C#程序员利用USB接口的功能,如读取、...

    C#中Socket服务端通讯的代码

    总之,C#中的Socket服务端编程是一个涉及多线程、异步操作和网络协议理解的复杂主题。通过合理的编程实践和优化,我们可以构建出高性能、可扩展的网络服务。"C#中Socket服务端通讯的代码"不仅展示了这些技术,还可能...

    C#串口通讯读写例子

    在实际应用中,可能需要更复杂的错误处理和流控制机制,例如使用`try-catch`块处理异常,或使用`Mutex`和`Semaphore`进行多线程同步,以确保在多个线程同时访问串口时不会发生冲突。 此外,`SerialPort`类还提供了...

    多线程串口通讯例子,vc#开发的例子。代码比较简洁。但是有参考价值.rar

    在这个例子中,我们关注的是一个使用VC#(Visual C#)语言编写的MFC(Microsoft Foundation Classes)应用程序,它展示了如何实现多线程与串口通信的结合。下面我们将详细探讨这个主题。 1. **多线程**:多线程编程...

    德国SICK RFID读卡器 读卡程序 TCP客户端 C# 异步读取

    在多线程环境中,委托可以用来作为线程间通信的桥梁,例如在上面提到的跨线程更新UI的例子中,`Control.BeginInvoke`方法就使用了委托来调用控件的方法。 总结起来,实现“德国SICK RFID读卡器RFU630”的TCP客户端...

    C#实现Socket高性能、大容量并发(附完整实例源码)

    - **多线程/线程池**:为每个客户端请求分配一个工作线程,但过多线程会消耗大量资源。线程池可以有效管理线程,避免资源浪费。 - **IO Completion Ports (IOCP)**:IOCP是一种高效的并发处理机制,可以处理大量...

Global site tag (gtag.js) - Google Analytics