2015-09-25 32 views
0

有點不適合今天的技術有關,但我saw another way of working在asp.net中APM環境的任務,除了Task.FromAsync爲什麼IHttpAsyncHandler提供extraData參數?

異步處理程序:

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投result.AsyncState到T和使用這些數據。

那麼,爲什麼呢?

回答

3

總之,APM Pattern需要以下。在這裏你不需要它,但是當關聯回調有用時,會出現一些情況(模式使用情況,而不是處理器使用情況)。

更新:

這裏是recommended way在APM使用Task S:

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

請注意,狀態傳遞給任務工廠,並將所得的任務同時作爲參數到回調和返回值。

+0

是的,我認爲是這樣/只是想確定。它只是想成爲一名優秀的APM公民。因此它遵循協議。但它實際上並不_nothing_ –

+0

不過,不要忘記將它傳遞給'IAsyncResult.AsyncState'。 –

+0

我想你的意思是說「當你沒有任何狀態」 - 但如果我這樣做 - 然後[我已經通過TCS來做](http://i.imgur.com/2LHERrg.png) –

相關問題