[英]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.