C#的委托

时间:2024-10-23 07:49:12

方法一

private void button1_Click(object sender, EventArgs e)
{
    // 启动后台线程  
    Thread backgroundThread = new Thread(new ThreadStart(DoWork));
    backgroundThread.Start();
}

private void DoWork()
{
    // 模拟后台工作  
    Thread.Sleep(2000); // 等待2秒以模拟工作  

    // 更新UI(需要在UI线程上执行)  
    UpdateTextBox("后台工作已完成!");
}

private void UpdateTextBox(string text)
{
    // 检查是否需要在UI线程上调用  
    if (textBox1.InvokeRequired)
    {
        // 使用Invoke方法将更新操作封送到UI线程(同步)  
        // 也可以使用BeginInvoke进行异步调用  
        textBox1.Invoke(new Action<string>(UpdateTextBox), text);
    }
    else
    {
        // 直接更新UI元素(已在UI线程上)  
        textBox1.Text = text;
    }
}

方法二

// 假设这是在非UI线程中  
this.Invoke(new Action(() =>  
{  
    // 这段代码将在UI线程上执行  
    this.label1.Text = "Updated from non-UI thread";  
}));

方法三
无参数、无返回值的委托(例如Action):

Action greet = () => Console.WriteLine("Hello, world!");  
greet(); // 输出: Hello, world!

有参数、无返回值的委托(例如Action<T>):

Action<string> printMessage = message => Console.WriteLine(message);  
printMessage("Hello, lambda!"); // 输出: Hello, lambda!

有参数、有返回值的委托(例如Func<T, TResult>):

Func<int, int> square = x => x * x;  
int result = square(5); // result 是 25

带有多个参数的lambda表达式:

Func<int, int, int> add = (a, b) => a + b;  
int sum = add(3, 4); // sum 是 7