我有一个具有以下签名的方法,它属于一个类。
public virtual IAsyncResult DoSomething(CustomOptions options);我正在尝试弄清楚如何准确地调用回调。我在任何地方都找不到要给出回调方法的事件。
发布于 2015-08-12 23:56:35
这几乎是从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方法,该方法接受一段代码(另一个任务)作为回调,该回调将在任务完成后运行。
发布于 2015-08-13 02:21:49
要了解如何使用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框架已经将其纳入其中。所以根据您的需求来决定收据的内容,不需要使用IAsyncResult。
请参见:
https://stackoverflow.com/questions/31969978
复制相似问题