在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。
举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
using System.Threading;
//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
this.TextBox1.Text="我是一个文本框";
}
如果你像上面操作,在VS2005或2008里是会有异常的...
正确的做法是用Invoke\BeginInvoke
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public delegate void MyInvoke(string str1,string str2);
public Form1()
{
InitializeComponent();
}
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
}
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
}
}
注意代理的使用!
转自:http://blog.3snews.net/html/30/34530-27563.html
分享到:
相关推荐
在.NET框架中,窗体程序的消息循环被封装在`Application.Run()`方法中,简化了开发者的工作。此方法自动启动消息泵,处理所有窗口过程的调用。 **3、线程外操作GUI控件的问题** GUI控件应由创建它们的线程管理,这...
标题"**C# Invoke调用Demo**"意味着我们将探讨如何在C#应用程序中使用`Invoke`方法处理多线程情况下的UI更新问题。描述中的“C# Invoke多线程调用Demo”进一步强调了这一点,暗示我们有一个实际的示例代码,可能包含...
如果没有指定,C#将使用方法名作为入口点。 5. `ExactSpelling`:如果设置为`true`,则要求入口点的拼写必须与指定的一致。默认为`false`,意味着允许小的拼写差异。 6. `PreserveSig`:决定了是否保持方法签名的...
以下是一个简单的示例,展示如何使用代理和`Invoke`方法安全地更新UI: ```csharp // 创建一个委托类型,表示要执行的方法 public delegate void UpdateUI(string message); // 在后台线程中更新UI private void ...
综上所述,在C#中使用Thread创建新线程来查询数据库,并安全地更新UI控件listView1,涉及到的关键技术点包括Thread类的使用、listView1控件的基本配置、Invoke方法的正确调用以及数据库查询操作。这些知识点的综合...
通过学习这个"C#串口操作小例子",开发者将能深入理解如何在.NET环境中使用P/Invoke技术进行串口通信,这对于开发涉及硬件交互的应用程序至关重要。在实际项目中,这种能力可以帮助开发者创建定制化的解决方案,以...
AutoCAD .NET ARX Invoke是AutoCAD开发中的一个重要概念,主要涉及到使用.NET Framework与AutoCAD的ARX(Acad Runtime Extension)应用程序之间的交互。在AutoCAD的开发环境中,.NET和ARX是两种不同的扩展机制,前者...
本文将深入探讨C#中的`Control.Invoke`方法以及如何正确地进行跨线程访问控件。 首先,理解线程的基本概念至关重要。线程是程序执行的最小单元,每个进程可以有多个线程。在Windows桌面应用中,UI(用户界面)通常...
本文将深入探讨委托的使用,特别是`Delegate`的`Invoke`方法,以及如何在实际编程中应用这些概念。 首先,让我们了解什么是委托。在C#中,委托是一种引用类型,它定义了一种方法签名,也就是说,它规定了可以关联到...
3. **使用DllImport特性导入DLL**:使用`[DllImport]`特性标记C#中的方法,指定DLL的路径和函数名称。这将告诉.NET Framework在运行时如何加载和调用非托管代码。 4. **处理指针和内存管理**:由于C#不支持直接操作...
在C#中,我们可以使用P/Invoke技术(Platform Invoke)来调用这些C++接口。 2. **P/Invoke与DLLImport**: 在C#中,我们不能直接调用C++的函数,所以需要使用`using System.Runtime.InteropServices;`引入`...
在.NET环境中,我们可以使用P/Invoke技术来调用这个原生库。首先,需要在C#项目中添加对libwebp.dll的引用,然后定义对应的C#接口以调用库函数。 例如,要将WebP图像转换为Bitmap,我们可以使用`WebPDecodeRGB`或`...
在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...
在C#编程中,尤其是在处理GUI应用程序时,`Invoke`和`BeginInvoke`是两个非常重要的方法,它们主要用于确保UI更新操作在正确的线程上执行。这是因为.NET框架中的大多数控件都设计为线程安全的,这意味着它们只能在其...
在代码中,你需要创建一个`Bitmap`对象来表示原始图像,然后使用`Rotation`类的`Rotate`方法来执行旋转操作。这个方法接受三个参数:源图像(`Bitmap`对象),旋转角度(以度为单位)和是否需要填充旋转后留下的空白...
在C#中,我们可以使用`DllImport`特性来调用这些DLL中的函数,进行P/Invoke(Platform Invoke)。 5. **Windows API调用**: - `winsiggen.exe`可能是一个Windows应用程序,它可能通过P/Invoke调用Windows API。在...
压缩包中的"CLRInsideOut"可能是一个工具或文档,它可能详细介绍了如何在.NET Framework(使用CLR,即公共语言运行时)中实现C++和C#之间的互操作,包括使用P/Invoke(Platform Invoke)技术,这是.NET中实现非托管...
开发者需要定义对应的函数原型,并指定对应的DLL导入,然后就可以在C#代码中像调用普通方法一样使用这些底层功能。例如,YUVLib.dll可能包含了一个名为`ConvertYUVtoRGB`的函数,接受YUV数据和目标缓冲区作为参数,...