转换异步方法以使用任务并行库
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# 都同样满意,所以任何答案将不胜感激。
谢谢,希望这是有道理的。
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;
假设我有以下异步方法的方法签名:
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# 都同样满意,所以任何答案将不胜感激。
谢谢,希望这是有道理的。
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;