zoukankan      html  css  js  c++  java
  • [C# 学习]委托和线程

    委托有点像C语言的函数指针,简单总结一下如何使用委托。

    1. 声明一个委托

    public delegate void LabelSetEventHandler(Label la, string str);

    2. 定义委托

    LabelSetEventHandler LabelSet;

    3. 实例化委托

    LabelSet = new LabelSetEventHandler(ChangeLabel);

    下面以实际例子来说明应用,现有一个窗口,一个按钮和一个Label, 希望通过单击按钮事件来改变Label显示的内容,通过委托的方法实现。

    完整代码如下:

    namespace Thread_
    {
        public partial class design : Form
        {
            public delegate void LabelSetEventHandler(string str);
            LabelSetEventHandler LabelSet;
            
            public design()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                LabelSet = ChangeLabel1; 
                LabelSet("Hi");
            }
    
            private  void ChangeLabel1(string str)
            {
                label1.Text = str;
            }
      }
    }

    有了以上委托的知识,那么我们就可以通过委托来跨线程安全调用控件了。

    现在在上面的基础上增加一个按键Button2,要求Button1的单击事件开启一个线程,改变Label1的内容为“Thread1”,Button2的单击事件开启另一个线程,改变Label1的内容为"Thread2"。一下是程序的完整代码。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace Thread_
    {
        public partial class design : Form
        {
            public delegate void LabelSetEventHandler(string str);
            LabelSetEventHandler LabelSet;
            
            public design()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(Thread1);
                th.Start();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(Thread2);
                th.Start();
    
            }
            private  void ChangeLabel1(string str)
            {
                label1.Text = str;
            }
    
            private void Thread1()
            {
                LabelSet = ChangeLabel1;
                BeginInvoke(LabelSet, "Thread1");
            }
    
            private void Thread2()
            {
                LabelSet = ChangeLabel1;
                BeginInvoke(LabelSet, "Thread2");
            }
      }
    }
  • 相关阅读:
    CMake 从文件路径中提取文件名
    std::multimap 按照key遍历---
    Windows / Linux 一件编译zlib库
    C++ 11 可变模板参数的两种展开方式
    cmake 生成VS项目文件夹
    C++ 利用文件流复制文件
    利用 getsockname 和 getpeername 来获取某一个链接的本地地址和远端地址
    Windows 用VS编译libevent源码
    揭示同步块索引(上):从lock开始
    C手写一个多线程,供java调用
  • 原文地址:https://www.cnblogs.com/mr-bike/p/3721646.html
Copyright © 2011-2022 走看看