我有一个属于一个类的具有以下签名的方法。
public virtual IAsyncResult DoSomething(CustomOptions options);
我试图弄清楚我究竟是如何调用回调的。我在任何地方都找不到要提供回调方法的事件。
我有一个属于一个类的具有以下签名的方法。
public virtual IAsyncResult DoSomething(CustomOptions options);
我试图弄清楚我究竟是如何调用回调的。我在任何地方都找不到要提供回调方法的事件。
这几乎是从 MSDN 复制的:
// Initiate the asychronous call.
IAsyncResult result = caller.BeginInvoke(3000,
out threadId, null, null);
Thread.Sleep(0);
Console.WriteLine("Main thread {0} does some work.",
Thread.CurrentThread.ManagedThreadId);
// Wait for the WaitHandle to become signaled.
result.AsyncWaitHandle.WaitOne();
// Perform additional processing here.
// Call EndInvoke to retrieve the results.
string returnValue = caller.EndInvoke(out threadId, result);
如果该方法是您自己的,您可能想尝试返回一个任务,该任务将具有一个 ContinueWith 方法,该方法将代码块(另一个任务)作为回调,一旦任务完成,它将运行。
要了解如何使用 IAsyncResult,您应该了解它的使用位置。它通常用于异步调用。最常见的用法是委托异步调用。在这种情况下,IAsyncResult 是一个收据,它被用作“信息载体”,并提供一个同步对象,以便在异步操作完成时中止线程。
通常您不需要创建 IAsyncResult。IAsyncResult 只是实现收据功能的一种方式。你可能不会把它弄得那么复杂。只需传输一个简单的结构来携带您需要的信息。
喜欢:
/// <summary>
/// This is a simplified IAsyncResult
/// </summary>
public class Receipt
{
/// <summary>
/// Name
/// </summary>
public String Name
{
get;
set;
}
/// <summary>
/// Age
/// </summary>
public Byte Age
{
get;
set;
}
public String OperationResultText
{
get;
set;
}
}
public class Test
{
public delegate void Async_OperationCallbackHandler(Receipt r);
public void MainEntry()
{
Thread tmpThread = new Thread(()=>
{
Async_Operation("ASDF", 20, Async_Operation_Callback);
});
tmpThread.Start();
}
public void Async_Operation(String name, Byte age, Async_OperationCallbackHandler callback)
{
//Do something with "name" and "age" and get result...
String result = "OK...";
Receipt r = new Receipt()
{
Age = age,
Name = name,
OperationResultText = result
};
callback(r);
}
internal void Async_Operation_Callback(Receipt r)
{
Console.WriteLine("Name = " + r.Name + ", Age = " + r.Age + ", Operation result: " + r.OperationResultText);
}
}
当然,我没有考虑同步。但是 .NET Framework 已经考虑到了这一点。所以根据自己的需要确定收据的内容,不需要使用IAsyncResult。
看: