C++ 的 C# TPL 数据流是不是有替代方案?
Posted
技术标签:
【中文标题】C++ 的 C# TPL 数据流是不是有替代方案?【英文标题】:Is there an alternative to C# TPL Dataflow for C++?C++ 的 C# TPL 数据流是否有替代方案? 【发布时间】:2013-03-28 14:36:04 【问题描述】:我最近在Using Delegates to simulate connected objects 上发布了一个问题,在那里我收到了关于使用 TPL DataFlow 库非常轻松、干净地为我的应用程序开发解决方案的一个很好的答案。
问题是我被困在 .NET 3.5 或 C# 之下。我想我可能已经能够升级到 .NET 4.5,但在这个阶段我还不能。据我所知,我无法将 Dataflow 库重新定位到 .NET 3.5,因此我的下一个解决方案是寻找与 TPL Dataflow 类似的 C++ 替代方案——这不是最好的方案,但我可以编译将 C++ 代码转换为 DLL 并将其导入我们的 C# 应用程序。
总结一下我对这个问题的 C++ 库的要求:
我需要能够将复杂网络中的节点连接在一起并在它们之间传递资源单元。随着时间的推移,其中一些将产生有限数量的资源。其他人会以特定的速度消耗它。【问题讨论】:
【参考方案1】:您可以考虑使用 mono's version of TPL Dataflow 并为 .Net 3.5 自行编译。
我认为您在尝试编译该代码时会遇到的最大问题是它严重依赖于 TPL,而 TPL 通常不适用于 .Net 3.5。但是it seems a backported version is available in older versions of Rx,所以使用它可以工作。
(另外,mono 版本的 TDF 的部分内容是我编写的,我几乎没有收到任何关于它的反馈,因此可以肯定其中存在错误。)
【讨论】:
这是很棒的信息。我现在让 TPL 在 .NET 3.5 中工作。但是,我仍在努力针对 .NET 3.5 TPL lib 以及它可能需要的任何其他内容编译 Dataflow。不太确定从哪里开始 - 我需要编译整个 Mono 包还是应该将该类提取到它自己的项目中并尝试隔离并编译它? @S.Richmond 我认为您应该采用 TPL Dataflow 项目并仅编译它。项目本身应该可以针对 MS .Net 4.5 进行编译,因此针对 .Net 3.5 进行编译应该(主要是?)包括 TPL。 现在这么近了!我必须从 mono 项目中包含一些 .Net v4 类,但到目前为止,一切都在编译,直到我在 Dataflow 语法中遇到一些错误。我认为这是由于实现上的细微差别。我现在正在研究如何修补它们,但希望您能提供意见。以下是错误和相关代码:pastebin.com/iNSHCVHq @S.Richmond 这两种方法是 .Net 4.5 的 TPL 中的新方法。创建自己的版本相对简单:FromResult()
by using TaskCompletionSource
和 WhenAll()
using ContinueWhenAll()
。【参考方案2】:
幸运的是,似乎有人正在创建 C# TPL 数据流的 C++ 等效项: https://github.com/renestein/Rstein.AsyncCpp#Flat-Dataflow
片段:
auto transform1 = DataFlowAsyncFactory::CreateTransformBlock<int, string>([](const int& item)-> Tasks::Task<string>
auto message = "int: " + to_string(item) + "\n";
cout << message;
//await async operation returning standard shared_future.
co_await GetCompletedSharedFuture();
co_return to_string(item);
);
【讨论】:
以上是关于C++ 的 C# TPL 数据流是不是有替代方案?的主要内容,如果未能解决你的问题,请参考以下文章