[C# 学习]委托和线程
阅读原文时间:2023年07月11日阅读:2

委托有点像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");  
    }  

  }
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章