我有一个方法,其中包含属于某个类的以下签名。
public virtual IAsyncResult DoSomething(CustomOptions options);
我试图弄清楚我究竟是如何调用回调的。我无法找到提供回调方法的事件。
答案 0 :(得分:1)
这几乎是从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);
如果方法是你自己的,你可能想尝试返回一个Task,它将有一个ContinueWith方法,它接受一个代码块(Another Task)作为回调,它将在Task完成后运行。 / p>
答案 1 :(得分:0)
要了解如何使用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。
请参阅: