`
sodart
  • 浏览: 27659 次
  • 性别: 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#),综合概念与例子,详细讲述多线程的运用

    1.多线程的概念 2.操纵线程 3.线程的同步和通讯 4.线程池和定时器 5.互斥对象 6.小结

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

    用C#编写套接字,进行通讯。在win7上两台电脑实验通讯通过。客户端和服务器分别是两个对话框。本例中,发送的是默认的字符串,而不是输入文本框中的内容。这点请大家使用或更改时注意。

    C# TCP网络通讯示例

    C# TCP网络通讯示例 线程 异步,简单易学的例子

    C#接口API通讯

    集成了SerialPort和API方式实现串口通信的例子.注意线程操作UI的部分图方便使用了不安全的代码,建议改为委托

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

    C#实现Socket高性能、大容量并发(附完整实例源码),可以先运行文件看代码。

    一个命名管道通信示例,包含客户端和服务器端

    命名管道可以用于本机的进程间或网络上不同机器进程间通信。这是一个运用命名管道进行通信的例子。包含客户端和服务器端。

    C#读写三菱PLC数据 使用TCP/IP 协议 全开源

    本例子读写三菱PLC数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 1)支持三菱Q系统 MC协议A-1E通信 2)支持三菱Q系统 MC...

    C#Socket、USB、串口通信(与打印机通信,东芝)

    额外增加了,接收数据的线程 与 界面更新的异步操作,只提供一种环境使用例子,具体的使用情况请结合实际自己修改

    socket通讯框架例子

    对你非常有帮助! 架构能力有所提升! 大文件传输 分页、分包、进度条 TCP工具测试几万线程依然威武

    .Net Socket编程资料

    (4)C#.net同步异步SOCKET通讯和多线程总结;(5)Socket使用简介;(6)同步套接字通信;(7)续实例解析SOCKET编程模型之异步通;(8)在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架;(9)重新研究socket传输自定义对象...

    C# UDP Demo

    UDP通讯server、client完整例子。 server用到多线程操作组件,需要用委托来实现。

    这是几个共享内存的案例

    资源尽是为了自己以后方便使用,也是从网上找的C#案例,Share_Memory_Sample、PIPE_Sample、使用互斥对象(Mutex)实现不同进程间线程同步、C#进程间通讯

    vc++ 应用源码包_1

    C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制...

    vc++ 应用源码包_6

    C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制...

    vc++ 应用源码包_5

    C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制...

    vc++ 应用源码包_2

    C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制...

    vc++ 应用源码包_3

    C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制...

    Winform弹出等待窗口(附多种Loading资源gif图)

    开发Winform程序的时,经常会用到等待窗口(如网络通讯、数据库操作等一些耗时操作),这样可以可以有更好的体验。  本例程等待窗口可以传入显示的问题动态更新显示的文字内容,添加了窗口句柄方法,可以在线程操作...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

Global site tag (gtag.js) - Google Analytics