方法一
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