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

约翰·布斯托斯

假设我具有以下用于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
    }
}

我正在寻找使用任务并行库做同样的事情,但不确定如何去做。实现相同结果的正确代码是:

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

还是有更好的方法来实现相同的结果?

另外,尽管这是用C#编写的,但我同样习惯于VB和C#,所以任何答案都将不胜感激。

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

理查德

假设我具有以下用于Async方法的方法签名:

public IAsyncResult MyAsyncMethod(AsyncCallback asyncCallback, object state);

我希望返回值为Task<T>IAsyncResult通常是从原始.NET异步模式中BeginXYZ存在匹配项时从中返回的EndXYZ),而不是进行回调。(如前所述,这似乎是一种模式,而另一种模式。)

如果我的期望是正确的,则只需调用该方法并使用retuned即可Task<T>

如果确实是a,IAsyncResultTaskFactory有一个辅助方法: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待和异步与任务并行库之间的区别

来自分类Dev

限制编号 Dns.BeginGetHostEntry方法每秒生成的请求数或使用任务并行库(TPL)

来自分类Dev

例程与任务并行库的实现

来自分类Dev

如何使用任务并行库发出许多HTTP请求

来自分类Dev

将实体框架与任务并行库结合使用

来自分类Dev

为什么使用任务并行库任务时httpcontext对象不可用?

来自分类Java

Java中的任务并行库的等效项

来自分类Dev

任务并行库中的线程数限制

来自分类Dev

任务并行库(TPL)中的线程同步

来自分类Dev

并行启动多个异步任务的最佳方法?

来自分类Dev

异步任务方法未并行运行

来自分类Dev

我应该选择与任务并行库一起使用的简单Dictionary或ConcurrentDictionary

来自分类Dev

使用任务并行库Task.WhenAny()时如何处理异常

来自分类Dev

任务并行库和长时间运行的任务

来自分类Dev

任务并行库异常句柄“任务已取消。”

来自分类Dev

如何使用具有负载平衡和有限并行度的任务并行库(TPL)?

来自分类Dev

使用Delphi XE7并行库

来自分类Dev

任务并行库(TPL)是否处理竞争条件

来自分类Dev

在ContinueWith(anotherTask)+ C#任务并行库中共享变量

来自分类Dev

如何处理任务并行库中的目录文件?

来自分类Dev

在异步任务中并行使用WebView2

来自分类Dev

查找并行异步任务的结果

来自分类Dev

并行运行异步任务

来自分类Dev

并行库的MaxDegreeOfParallelism值?

来自分类Dev

异步方法并行执行

来自分类Dev

使用Task并行库进行I / O绑定处理

来自分类Dev

使用异步任务方法处理DbContext

来自分类Dev

使用任务异步方法加载集合视图

来自分类Dev

转换使用任务的便捷方法

Related 相关文章

热门标签

归档