与今天的技术有点不相关,但除了Task.FromAsync
asp.net中的异步处理程序:
public class Handler : IHttpAsyncHandler
{
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//...
}
public void EndProcessRequest(IAsyncResult result)
{
//...
}
}
context
参数是我可以访问/
(或传递给另一个beginXXX操作)请求和响应的实际上下文。cb
让我在操作完成后执行/
(或传递到另一个beginXXX操作)。问题
但object extraData
在方法的签名中做了什么?
不我从框架中得到一些状态,相反 - 我创建状态并将其传递给我,以便我的EndXXX可以投射{{1}转到T并使用该数据。
那为什么会这样?
答案 0 :(得分:3)
简而言之,APM Pattern需要IHttpAsyncHandler
。你在这里不需要它,但是当关联回调时,有些情况(模式使用,而不是处理程序使用)。
<强>更新强>
这里是recommended way在APM中使用Task
:
public IAsyncResult BeginCalculate(int decimalPlaces, AsyncCallback ac, object state)
{
Console.WriteLine("Calling BeginCalculate on thread {0}", Thread.CurrentThread.ManagedThreadId);
Task<string> f = Task<string>.Factory.StartNew(_ => Compute(decimalPlaces), state);
if (ac != null) f.ContinueWith((res) => ac(f));
return f;
}
public string Compute(int numPlaces)
{
Console.WriteLine("Calling compute on thread {0}", Thread.CurrentThread.ManagedThreadId);
// Simulating some heavy work.
Thread.SpinWait(500000000);
// Actual implemenation left as exercise for the reader.
// Several examples are available on the Web.
return "3.14159265358979323846264338327950288";
}
public string EndCalculate(IAsyncResult ar)
{
Console.WriteLine("Calling EndCalculate on thread {0}", Thread.CurrentThread.ManagedThreadId);
return ((Task<string>)ar).Result;
}
请注意,状态是传递给任务工厂,结果任务用作回调的参数和返回值。