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
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 不同,此方法进行同步操作,即一直等到进程完成后才返回。在调用期间引发的异常被传播回调用方。当从另一个线程调用方法时,使用此方法将调用封送到正确的线程。
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 方法。
BeginInvoke 异步调用
BeginInvoke设置完回调之后会得到一个IAsyncResult对象,你可以据此判断,调用是否执行完成。你甚至可以通过等待该对象提供的句柄的方式等待其完成。
{
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
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 不同,此方法进行同步操作,即一直等到进程完成后才返回。在调用期间引发的异常被传播回调用方。当从另一个线程调用方法时,使用此方法将调用封送到正确的线程。
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 方法。
Invoke就是同步调用,和调用一个方法没啥两样,调用委托并等待它执行完毕。