方式一 BeginInvoke,EndInvoke,IAsyncResult
using System;
using System.Threading;
static void Main()
{
Func<int, int, int> add = (a, b) =>
{
Thread.Sleep(2000);
return a + b;
};
AsyncCallback callback = ar =>
{
int result = add.EndInvoke(ar);
string message = (string)ar.AsyncState;
Console.WriteLine("Result: " + result + ", Message: " + message);
};
IAsyncResult asyncResult = add.BeginInvoke(1, 2, callback, "Addition completed");
Console.WriteLine("Main thread continues...");
}
注释
IAsyncResult是一个接口,它表示异步操作的结果。BeginInvoke和EndInvoke是委托类型的方法,它们用于异步调用委托。
以下是IAsyncResult接口的定义:
public interface IAsyncResult
{
bool IsCompleted { get; }
WaitHandle AsyncWaitHandle { get; }
object AsyncState { get; }
bool CompletedSynchronously { get; }
}
IAsyncResult接口包含以下属性:
IsCompleted:表示异步操作是否已完成。
AsyncWaitHandle:表示异步操作的等待句柄。
AsyncState:表示异步操作的状态。
CompletedSynchronously:表示异步操作是否同步完成。
以下是BeginInvoke和EndInvoke方法的原型:
public IAsyncResult BeginInvoke(/* 委托参数 */, AsyncCallback callback, object state);
public /* 委托返回类型 */ EndInvoke(IAsyncResult asyncResult);
BeginInvoke方法用于异步调用委托,它接受委托的参数、回调函数和状态对象作为参数,并返回一个IAsyncResult对象。EndInvoke方法用于获取异步调用的结果,它接受一个IAsyncResult对象作为参数,并返回委托的返回值。
AsyncCallback 是一个委托类型,它表示异步操作完成时的回调函数。AsyncCallback 的原型如下:
public delegate void AsyncCallback(IAsyncResult asyncResult);
AsyncCallback 委托接受一个 IAsyncResult 类型的参数,表示异步操作的结果。在异步操作完成时,AsyncCallback 委托将被调用,以便处理异步操作的结果。
在这个示例中,我们使用 BeginInvoke 方法异步调用 add 方法,并在 add 方法执行完成后使用 AsyncCallback 委托获取结果。这样就实现了异步调用,主线程在 add 方法执行时可以继续执行其他任务。
在这个例子中,BeginInvoke的最后一个参数是一个object类型的state参数。这个参数通常用于传递一些额外的状态信息,以便在异步操作完成时可以在回调函数中使用。示例中,我们将一个字符串"Addition completed"作为state参数传递给BeginInvoke方法。然后,在回调函数中,我们使用ar.AsyncState获取这个字符串,并将其与结果一起输出。
在C#中,你可以使用System.Threading.Thread.CurrentThread.ManagedThreadId属性获取当前线程的ID,并使用Console.WriteLine()方法将其输出到控制台。此例中,add方法和AsyncCallback 委托指向的方法在同一个线程中,和主线程是不同的线程