[英]Convert an Async method to use Task Parallel Library
假設我為異步方法具有以下方法簽名:
public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);
因此,我使用以下代碼對其進行調用,並為其分配一個state
對象和一個回調:
public class test
{
// Private class to hold / pass-through data used by Async operations
private class StateData
{
//... Whatever properties I'll need passed to my callback ...
}
public void RunOnSeparateThread()
{
StateData stateData = new StateData { ... };
MyAsyncMethod(m_asyncCallback, stateData);
}
private AsyncCallback m_asyncCallback = new AsyncCallback(AsyncComplete);
private static void AsyncComplete(IAsyncResult result)
{
// Whatever stuff needs to be done after completion of Async method
// using data returned in the stateData object
}
}
我正在尋找使用任務並行庫執行相同的操作,但不確定如何執行。 實現相同結果的正確代碼是:
MyAsyncMethod
state
對象傳遞給下一個方法-在這種情況下,為AsyncComplete
還是有更好的方法來實現相同的結果?
另外,盡管這是用C#編寫的,但我對VB和C#同樣滿意,因此,任何答復都將不勝感激。
謝謝,希望這是有道理的。
假設我為異步方法具有以下方法簽名:
public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);
我期望的返回值是Task<T>
IAsyncResult
通常從返回BeginXYZ
時,有一個匹配EndXYZ
在原始.NET異步模式)和未服用的回調。 (如前所述,這似乎是一種模式,而另一種模式。)
如果我的期望是正確的,則只需調用該方法並使用重新調整的Task<T>
。
如果確實是IAsyncResult
則TaskFactory
有一個輔助方法: FromAsync
,它的許多重載中都可以采用IAsyncResult
和Action<IAsyncResult>
。
因此,您的代碼變為:
var ia = MyAsyncMethod(() => {}, null);
var t = Task.Factory.FromAsync(ia, x => {
// called with ia from MyAsyncMethod on completion.
// Can close over any state
});
// ...
var result = (TypeofResult)t.Result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.