假设我有一个Async方法的以下方法签名:
for(i = 0; i < n; ++i) {
strcpy(s[i], sl[i]);
}
因此,我使用以下代码调用它并为其分配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
或者有更好的方法来实现相同的结果吗?
此外,虽然这是用C#编写的,但我在VB和C#中也同样适用,所以任何答案都会非常感激。
谢谢你,希望这是有道理的。
答案 0 :(得分:1)
假设我有一个Async方法的以下方法签名:
public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);
我希望返回值为Task<T>
(IAsyncResult
通常在原始.NET异步模式中匹配BeginXYZ
时从EndXYZ
返回,而不是回电。 (如图所示,它似乎只是一种模式而另一种模式。)
如果我的期望是正确的,只需调用方法并使用重新调整的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;