转换Async方法以使用任务并行库

时间:2015-04-23 13:05:18

标签: c# vb.net multithreading asynchronous task-parallel-library

假设我有一个Async方法的以下方法签名:

for(i = 0; i < n; ++i) {
    strcpy(s[i], sl[i]);
}

因此,我使用以下代码调用它并为其分配public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state); 对象和回调:

state

我希望使用任务并行库做同样的事情,我不确定如何做到这一点。实现相同结果的正确代码是什么:

  1. 在单独的主题
  2. 上运行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 } }
  3. 完成后会返回一个MyAsyncMethod对象,并将其传递给下一个方法 - 在这种情况下state
  4. 或者有更好的方法来实现相同的结果吗?

    此外,虽然这是用C#编写的,但我在VB和C#中也同样适用,所以任何答案都会非常感激。

    谢谢你,希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

  

假设我有一个Async方法的以下方法签名:

public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);

我希望返回值为Task<T>IAsyncResult通常在原始.NET异步模式中匹配BeginXYZ时从EndXYZ返回,而不是回电。 (如图所示,它似乎只是一种模式而另一种模式。)

如果我的期望是正确的,只需调用方法并使用重新调整的Task<T>

如果确实是IAsyncResult,那么TaskFactory有一个辅助方法:FromAsync在其多次重载中可以使用IAsyncResultAction<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;