为什么IHttpAsyncHandler提供extraData参数?

时间:2015-09-25 11:37:38

标签: c# asp.net asynchronous

与今天的技术有点不相关,但除了Task.FromAsync

之外,我saw another way of working在APM环境中使用了任务

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并使用该数据。

那为什么会这样?

1 个答案:

答案 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;
}

请注意,状态是传递给任务工厂,结果任务用作回调的参数和返回值。