一个委托的问题.

qingniaoIT 2006-10-24 09:48:51
Control.Invoke(...) 和 Control.BeginInvoke(...) 两委托调用有什么区别???
...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivony 2006-10-24
  • 打赏
  • 举报
回复
上海北京根本就是胡说八道嘛……
Invoke就是同步调用,和调用一个方法没啥两样,调用委托并等待它执行完毕。
scow 2006-10-24
  • 打赏
  • 举报
回复
control.invoke调用没返回的话,会阻塞,这就是同步.虽然它切换上下文到另一个线程的说.
aafshzj 2006-10-24
  • 打赏
  • 举报
回复
哦,犯了点错误,谢谢指正。
真相重于对错 2006-10-24
  • 打赏
  • 举报
回复
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++

JScript

Visual 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 方法。

真相重于对错 2006-10-24
  • 打赏
  • 举报
回复
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++

JScript

Visual 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 不同,此方法进行同步操作,即一直等到进程完成后才返回。在调用期间引发的异常被传播回调用方。

当从另一个线程调用方法时,使用此方法将调用封送到正确的线程。

真相重于对错 2006-10-24
  • 打赏
  • 举报
回复
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

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

注意 Microsoft C# 编译器目前支持异步委托。
aafshzj 2006-10-24
  • 打赏
  • 举报
回复
如果你的回调有返回值(如out参数),你就更要使用begininvoke,并且使用endinvoke提取这些参数。
aafshzj 2006-10-24
  • 打赏
  • 举报
回复
不是异步不异步的关系。Control的Invoke传递的delegate本身也是被异步调用。这和普通的delegate调用不完全一样。
aafshzj 2006-10-24
  • 打赏
  • 举报
回复
Invoke就是设置完回调就走了,什么时候调用我不管也不准备干预。
BeginInvoke设置完回调之后会得到一个IAsyncResult对象,你可以据此判断,调用是否执行完成。你甚至可以通过等待该对象提供的句柄的方式等待其完成。
真相重于对错 2006-10-24
  • 打赏
  • 举报
回复
Invoke 同步调用
BeginInvoke 异步调用
commandown 2006-10-24
  • 打赏
  • 举报
回复
一个是即时开始调用,一个是由系统协调调用(可能只是推入一个等待队列)
像线程池

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧