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

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
    }
}

我想使用任务并行库来做同样的事情,但不确定如何做。获得相同结果的正确代码是:

  1. 运行 MyAsyncMethod 在单独的线程上
  2. 完成后有一个 state 对象返回并传递给下一个方法 - 在这种情况下 AsyncComplete

或者是否有更好的方法来实现相同的结果?

此外,虽然这是用 C# 编写的,但我对 VB 和 C# 都同样满意,所以任何答案将不胜感激。

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

Suppose I have the following method signature for an Async method:

public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);

我希望 return 值是 Task<T>IAsyncResult 通常是 return 从 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;