`

Invoke()/BeginInvoke()区别

    博客分类:
  • C#
阅读更多

查看MSDN如下:

   Control..::.Invoke          ---> 在拥有此控件的基础窗口句柄的线程上执行委托。

   Control..::.BeginInvoke  ---> 在创建控件的基础句柄所在线程上异步执行委托。

  显然,Invoke() 与 BeginInvoke() 方法间的主要区别在于“异步”关键字眼。
  也就是说,
       Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
       BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。
       EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。

控件为何会需要Invoke()或BeginInvoke()方法呢?

  因为控件的这样一个特点:控件的数据(或状态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的,则其它任何线程B都不允许修改控件的值,只可以访问(读取)。控件的值只能在线程A上进行更改。

基于以上原因,而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。所以,Invoke()/BeginInvoke() 就出现了。使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行。

 

转自:http://blog.csdn.net/xiaogang3438792/archive/2009/05/11/4166911.aspx

分享到:
评论

相关推荐

    Invoke 与BeginInvoke的区别

    ### Invoke与BeginInvoke的区别 #### 一、基本概念 在.NET框架中,`Invoke` 和 `BeginInvoke` 是两个常用的方法,主要用于实现跨线程访问控件或执行操作。这两种方法通常出现在多线程编程场景中,特别是当涉及到UI...

    C#窗体中Invoke和BeginInvoke方法详解

    #### 二、Invoke和BeginInvoke的使用方式及区别 `Invoke`和`BeginInvoke`方法都接受一个委托作为参数,并用于跨线程调用。这两种方法的核心区别在于同步与异步的处理方式: ##### 1. Invoke - **同步调用**:当...

    Invoke和BeginInvoke对比介绍

    就Invoke和BeginInvoke进行对比介绍,穿插了一些例子在里面

    c# 中Invoke和BeginInvoke_区别

    c# 中Invoke和BeginInvoke_区别, 适合初学者,一看就会

    invoke和beginInvoke

    本文将深入探讨invoke和beginInvoke的区别、使用场景以及它们在多线程环境中的重要性。 1. **委托(Delegate)的理解**: - 委托是.NET中一种类型安全的函数指针,它可以引用一个或多个方法。通过委托,我们可以将...

    c# Invoke和BeginInvoke 区别分析

    在C#编程中,`Invoke` 和 `BeginInvoke` 是两个关键的方法,它们主要用于处理多线程环境下的UI更新问题。这两个方法都是Windows Forms或WPF应用程序中`Control`类的成员,它们允许非UI线程对UI组件进行操作,因为...

    C_窗体中Invoke和BeginInvoke方法详解

    C_窗体中Invoke和BeginInvoke方法详解 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等

    Windows7上安装SqlServer 2008时出现不能Invoke或BeginInvoke的解决办法.pdf

    在Windows 7操作系统中安装Microsoft SQL Server 2008时,可能会遇到一个常见的错误,即"Invoke或BeginInvoke不能在控件上被调用,直到窗口句柄被创建"。这个错误通常与应用程序试图在窗口句柄未准备好时执行某些...

    Windows7上安装SqlServer 2008时出现不能Invoke或BeginInvoke的解决办法.docx

    在Windows 7操作系统中安装Microsoft SQL Server 2008时,可能会遇到一个特定的问题,即在安装过程中显示“Invoke或BeginInvoke不能在控件上被调用,直到窗口句柄已被创建”的错误。这个错误通常表明安装程序与系统...

    C#子线程更新UI控件的方法实例总结

    本文实例总结了C#子线程更新UI控件的方法,...1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更新 具体实现如下: 1.使用控件自身的invoke/BeginInvoke方法 Control类实现了ISyn

    跨线程调用控件的四种方式.rar

    与`Invoke/BeginInvoke`类似,`Dispatcher.Invoke`和`Dispatcher.BeginInvoke`允许在非UI线程中安全地操作UI元素。WPF的`Dispatcher`提供了优先级等级,允许根据需要调整操作的执行顺序。 3. **...

    C#的核心问题-基础问题-如何安全的跨线程访问控件的修改.rar

    类似于`Invoke/BeginInvoke`,你可以使用`Dispatcher.Invoke`和`Dispatcher.BeginInvoke`来确保在UI线程上执行操作。 实例对比这些方法可以帮助初学者理解它们的差异和适用场景。例如,`Invoke`适合于需要立即更新...

    winform 阻止线程执行上下文流动源码

    - .NET Framework为解决这个问题提供了`Control.Invoke`和`Control.BeginInvoke`方法。这两个方法允许在非UI线程上调度对UI控件的操作,确保它们在正确的上下文中执行。 - `Invoke`是同步的,会阻塞当前线程直到UI...

    C#中跨线程访问控件问题解决方案[文].pdf

    - 然后,你可以创建这个委托的实例,并通过控件的Invoke或BeginInvoke方法调用它。Invoke是同步的,会阻塞当前线程直到UI操作完成;而BeginInvoke是异步的,不会阻塞线程,但可能会导致顺序问题,因此需要谨慎使用...

    C__BeginInvoke_和Invoke区别

    C__BeginInvoke_和Invoke区别 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等

    Invoke-and-BeginInvoke.rar_The Difference_invoke

    在Windows Forms或WPF等UI环境中,由于UI元素(如控件)只能在其创建的线程(即UI线程)中进行修改,因此,当需要在后台线程更新UI时,`Invoke`和`BeginInvoke`就显得尤为重要。这两个方法都是`Control`类的成员,...

    C#BeginInvoke_和Invoke区别

    ### C#中的`Invoke`与`BeginInvoke`详解 #### 一、基本概念 在C#编程中,尤其是在处理GUI应用程序时,`Invoke`和`BeginInvoke`是两个非常重要的方法,它们主要用于确保UI更新操作在正确的线程上执行。这是因为.NET...

    C#中Invoke 和 BeginInvoke 的真正涵义

    在C#编程中,Invoke和BeginInvoke是两个与线程交互和UI更新紧密相关的概念,尤其是在Windows Forms应用程序中。这两个方法主要用于解决多线程环境下的界面更新问题,确保非UI线程安全地修改UI组件。 首先,理解这两...

    c#多线程中子线程动态改变ui控件

    一、使用控件自身的Invoke/BeginInvoke方法 Control类实现了ISynchronizeInvoke接口,我们可以使用Invoke方法异步更新UI控件。Invoke方法有两个实现:Object Invoke(Delegate);和Object Invoke(Delegate,Object[] )...

Global site tag (gtag.js) - Google Analytics