`

.NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke

阅读更多

1,错误的代码是:

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;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string blog = "http://www.chenjiliang.com/";


        private void Form1_Load(object sender, EventArgs e)
        {
            new System.Threading.Thread(ShowTime).Start();
        }

        private void ShowTime()
        {
            textBox1.Text = DateTime.Now.ToString();
        }
    }
}

 

会看到Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.的错误

2,增加一个Public static 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace WindowsFormsApplication5
{
    public static class ControlExtention
    {
        public delegate void InvokeHandler();

        public static void SafeInvoke(this Control control, InvokeHandler handler)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(handler);
            }
            else
            {
                handler();
            }
        }
    }
}

 


3,build

4,这样写就好啦

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;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string s = "http://www.chenjiliang.com/";

        private void Form1_Load(object sender, EventArgs e)
        {
            new System.Threading.Thread(ShowTime).Start();
        }

        private void ShowTime()
        {
            this.SafeInvoke(() =>
            {
                textBox1.Text = DateTime.Now.ToString();
            });
        }
    }
}

 

分享到:
评论

相关推荐

    Delegate与Action.docx

    通过上述步骤,我们不仅解决了跨线程访问控件的问题,还深入了解了委托、`Invoke`方法以及如何利用`Action`委托和Lambda表达式简化代码。这些技术的应用对于构建高效、可维护的多线程应用程序至关重要。

    委托 实例窗体互动 C#

    要创建一个委托实例,你需要定义一个方法,该方法的签名与委托类型匹配,然后通过`.Invoke()`或`.BeginInvoke()`方法调用委托实例来执行这些方法。例如: ```csharp public delegate void MyDelegate(string ...

    练习winforms

    - **Invoke/BeginInvoke**:更新UI控件时必须在UI线程中进行,这两者用于跨线程调用。 9. **国际化和本地化**: - **资源文件**:存储字符串和其他本地化资源,可以根据用户设置的区域设置加载相应语言的资源。 ...

    紅皮書c#2008高級編程 最新版

    - 介绍了如何使用.NET Framework与SQL Server进行交互。 - 讨论了SQL Server的高级特性,如存储过程、触发器等。 - 分析了性能优化的策略和技术。 #### 六、用户界面开发 31. **Windows窗体(第31章)** - ...

    C#源代码-使用Winform应用程序模拟事件.zip

    - 从C# 3.0开始,我们可以使用匿名方法或Lambda表达式来简化事件处理程序的定义,例如`button.Click += (sender, e) => Console.WriteLine("Button clicked!");` 6. **控制台应用程序与Winform应用程序的差异** -...

    C# 编写winform程序实现UDP通信

    - 对于UI线程安全,确保在WinForm控件的更新操作(如显示接收到的消息)在UI线程上执行,可以使用`Control.Invoke()`或`Control.BeginInvoke()`方法。 6. **异常处理**: - UDP通信可能会遇到各种网络问题,如...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·指导读者用c++和c++/cli设计和创建大量的windows应用程序  ·为帮助读者掌握编程技巧,提供了大量可运行的示例和练习 作译者  Ivor Horton是撰著Java、C和C++编程语言图书的杰出作家之一。大家一致认为,...

    学习C#(第11天):C#中的事件(一种实用方法)

    当用户点击按钮时,控件(按钮)作为事件源,触发事件,而UI的其他部分(如窗体)作为事件处理器,响应事件并执行相应的操作。 C#的事件模型还支持匿名方法和Lambda表达式,使得订阅事件更加简洁: ```csharp ...

Global site tag (gtag.js) - Google Analytics