什么时候会选择使用Rx而不是TPL,或者2个框架是否正交?
根据我的理解,Rx主要用于提供事件的抽象并允许组合,但它也允许提供异步操作的抽象.使用Createxx重载和Fromxxx重载并通过处理返回的IDisposable取消.
TPL还通过任务和取消功能提供操作抽象.
我的困境是什么时候使用哪种情况?
当F#出现时,我将对异步/并行编程领域的财富感到尴尬.这个问题的答案可以很好地描述任务,并行LINQ和Reactive Framework之间的差异,但我想知道异步工作流如何适应图片.
如果我错了,请纠正我,但据我所知,asynch工作流将是使用IO绑定操作的最简单方法,特别是那些定义了AsynchXxx方法的操作,或者遵循BeginXxx/EndXxx模式.另一个优点是异步工作流可以组合,并且可以由其他异步工作流构建 - 这可以在程序结构的方式中提供很大的灵活性.
我想我需要帮助的是理解在什么情况下我会在F#代码中选择任务或PLINQ而不是异步工作流.我相信我读到任务并行库有更复杂的方法来平衡核心之间的负载.如果这是真的,那么对于需要并行操作的纯CPU绑定操作,Tasks可能是更好的选择.另一方面,PLINQ似乎主要是一种方便的方法来并行化与序列一起使用的现有代码.
最后,假设我对每种方法的优势的理解是正确的,将它们组合起来是否可行或可取?例如,也许可以从异步工作流中组合一系列操作,然后在执行之前将它们转换为Tasks.如果可能 - 甚至是个好主意.
在仔细阅读了Rx.NET的样本后,我对于Reactive Extensions的概念和实现有多么精彩.它似乎为开发人员提供了一种更易于维护的模式,用于实现.NET 4.0的任务并行库提供的相同类型的多线程并行编码.
Rx.NET会取代TPL吗?应该是?
给定一个BehaviorSubject,调用所有这些不同函数之间的实际区别是什么?
假设我理解正确,他们应该做同样的事情,给定BehaviorSubject.
如果是这样,那么哪个电话是最合适的(我的意思是:哪个最符合我的意图)?也许是第一个还是一个
如果没有,那么实际的差异是什么?
简介:我从System.Threading.Tasks.Parallel.ForEach和Concurrent Data结构更改为简单的plinq(Parallel Linq)查询.加速是惊人的.
那么plinq固有地比Parallel.ForEach快吗?或者它是否特定于任务.
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
Run Code Online (Sandbox Code Playgroud)
注意:每个任务(PerformWork)现在运行0到200毫秒.在我优化它之前,它需要更长的时间.这就是我在第一时间使用Tasks.Parallel库的原因.所以我从总时间的2秒到大约100-200毫秒的总时间,执行大致相同的工作,只是使用不同的方法.(哇linq和plinq太棒了!)
问题:
PLINQ主要基于功能风格的编程而没有副作用,而副作用正是TPL的用途.如果你想实际并行工作而不是仅仅并行搜索/选择事物,你可以使用TPL.
我可以假设,因为我的模式基本上是功能性的(给输入产生没有突变的新输出),plinq是正确使用的技术吗?
我正在寻找验证我的假设是正确的,或者表明我错过了什么.
有几篇关于此的文章,我有这个工作...但我想知道如何为我的Observable订阅一次设置最大数量的任务线程.
我有以下内容来并行化异步保存日志条目:
private BlockingCollection<ILogEntry> logEntryQueue;
Run Code Online (Sandbox Code Playgroud)
和
logEntryQueue = new BlockingCollection<ILogEntry>();
logEntryQueue.GetConsumingEnumerable().ToObservable(Scheduler.TaskPool).Subscribe(SaveLogEntry);
Run Code Online (Sandbox Code Playgroud)
要安排我的保存...但是如何指定调度程序一次使用的最大线程数?