Control.Invoke(...)  和 Control.BeginInvoke(...) 两委托调用有什么区别???

解决方案 »

  1.   

    Invoke 同步调用
    BeginInvoke 异步调用
      

  2.   

    Invoke就是设置完回调就走了,什么时候调用我不管也不准备干预。
    BeginInvoke设置完回调之后会得到一个IAsyncResult对象,你可以据此判断,调用是否执行完成。你甚至可以通过等待该对象提供的句柄的方式等待其完成。
      

  3.   

    不是异步不异步的关系。Control的Invoke传递的delegate本身也是被异步调用。这和普通的delegate调用不完全一样。
      

  4.   

    如果你的回调有返回值(如out参数),你就更要使用begininvoke,并且使用endinvoke提取这些参数。
      

  5.   

    异步委托提供以异步方式调用同步方法的能力。当同步调用一个委托时,Invoke 方法直接对当前线程调用目标方法。如果编译器支持异步委托,则它将生成 Invoke 方法以及 BeginInvoke 和 EndInvoke 方法。如果调用 BeginInvoke 方法,则公共语言运行库将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行,该目标方法是对线程池线程运行的。如果已经对 BeginInvoke 指定了回调,当目标方法返回时将调用它。在回调中,使用 EndInvoke 方法来获取返回值和输入/输出参数。如果没有对 BeginInvoke 指定回调,则可以在提交请求的原始线程上使用 EndInvoke。注意   Microsoft C# 编译器目前支持异步委托。
      

  6.   

    class Class1
    {
    public delegate void testdel();
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    //
    // TODO: 在此处添加代码以启动应用程序
    //
    testdel t = new testdel(ontest);


    t.BeginInvoke( new System.AsyncCallback( ac ) , null);
    Console.WriteLine("main program");
    Console.ReadLine();
    }
    public static void ontest()
    {
    System.Threading.Thread.Sleep(10);
    Console.WriteLine("delegate program ");
    }
    public static void ac( System.IAsyncResult ir )
    {}
    }
    output:
    main program
    delegate program
      

  7.   

    Control 实现了ISynchronizeInvoke接口,这两个函数就是ISynchronizeInvoke的成员ISynchronizeInvoke.Invoke 方法  [C#]请参见
    ISynchronizeInvoke 接口 | ISynchronizeInvoke 成员 | System.ComponentModel 命名空间 | ISynchronizeInvoke 成员(Visual J# 语法) | C++ 托管扩展编程 
    要求
    平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列
    语言
    C#C++JScriptVisual Basic全部显示
    在执行此对象的主线程上执行委托。[Visual Basic]
    Function Invoke( _
       ByVal method As Delegate, _
       ByVal args() As Object _
    ) As Object[C#]
    object Invoke(
       Delegate method,
       object[] args
    );[C++]
    Object* Invoke(
       Delegate* method,
       Object* args __gc[]
    );[JScript]
    function Invoke(
       method : Delegate,
       args : Object[]
    ) : Object;参数
    method 
    包含要调用的方法的 Delegate,在控件的线程上下文中。 
    args 
    表示要传递到给定方法的参数的 Object 类型数组。如果不需要参数,则可以为空引用(Visual Basic 中为 Nothing)。 
    返回值
    表示正被调用的委托返回值的 Object;如果该委托没有返回值,则为空引用(Visual Basic 中为 Nothing)。备注
    与 BeginInvoke 不同,此方法进行同步操作,即一直等到进程完成后才返回。在调用期间引发的异常被传播回调用方。当从另一个线程调用方法时,使用此方法将调用封送到正确的线程。
      

  8.   

    ISynchronizeInvoke.BeginInvoke 方法  [C#]请参见
    ISynchronizeInvoke 接口 | ISynchronizeInvoke 成员 | System.ComponentModel 命名空间 | EndInvoke | ISynchronizeInvoke 成员(Visual J# 语法) | C++ 托管扩展编程 
    要求
    平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列
    语言
    C#C++JScriptVisual Basic全部显示
    在执行此对象的主线程上执行委托。[Visual Basic]
    Function BeginInvoke( _
       ByVal method As Delegate, _
       ByVal args() As Object _
    ) As IAsyncResult[C#]
    IAsyncResult BeginInvoke(
       Delegate method,
       object[] args
    );[C++]
    IAsyncResult* BeginInvoke(
       Delegate* method,
       Object* args __gc[]
    );[JScript]
    function BeginInvoke(
       method : Delegate,
       args : Object[]
    ) : IAsyncResult;参数
    method 
    对方法的 Delegate,采用 args 中包含的相同数字和类型的参数。 
    args 
    作为给定方法的参数传递的 Object 类型数组。如果不需要参数,则可以为空引用(Visual Basic 中为 Nothing)。 
    返回值
    IAsyncResult 接口,表示通过调用此方法启动的异步操作。备注
    可异步调用委托并且此方法立即返回。可以从任何线程调用此方法。如果需要此方法所启动的进程的返回值,则调用 EndInvoke 获取该值。如果需要同步调用委托,则改用 Invoke 方法。
      

  9.   

    control.invoke调用没返回的话,会阻塞,这就是同步.虽然它切换上下文到另一个线程的说.
      

  10.   

    上海北京根本就是胡说八道嘛……
    Invoke就是同步调用,和调用一个方法没啥两样,调用委托并等待它执行完毕。