假设我具有以下用于Async方法的方法签名:
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#,所以任何答案都将不胜感激。
谢谢,希望这是有道理的。
假设我具有以下用于Async方法的方法签名:
public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);
我希望返回值为Task<T>
(IAsyncResult
通常是从原始.NET异步模式中BeginXYZ
存在匹配项时从中返回的EndXYZ
),而不是进行回调。(如前所述,这似乎是一种模式,而另一种模式。)
如果我的期望是正确的,则只需调用该方法并使用retuned即可Task<T>
。
如果确实是a,IAsyncResult
则TaskFactory
有一个辅助方法:FromAsync
在许多重载方法中,可以使用anIAsyncResult
和an 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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句