相关疑难解决方法(0)

TPL与反应框架

什么时候会选择使用Rx而不是TPL,或者2个框架是否正交?

根据我的理解,Rx主要用于提供事件的抽象并允许组合,但它也允许提供异步操作的抽象.使用Createxx重载和Fromxxx重载并通过处理返回的IDisposable取消.

TPL还通过任务和取消功能提供操作抽象.

我的困境是什么时候使用哪种情况?

.net c# task-parallel-library system.reactive

41
推荐指数
5
解决办法
1万
查看次数

F#:Asynch和Tasks以及PLINQ,哦,我的!

当F#出现时,我将对异步/并行编程领域的财富感到尴尬.这个问题答案可以很好地描述任务,并行LINQ和Reactive Framework之间的差异,但我想知道异步工作流如何适应图片.

如果我错了,请纠正我,但据我所知,asynch工作流将是使用IO绑定操作的最简单方法,特别是那些定义了AsynchXxx方法的操作,或者遵循BeginXxx/EndXxx模式.另一个优点是异步工作流可以组合,并且可以由其他异步工作流构建 - 这可以在程序结构的方式中提供很大的灵活性.

我想我需要帮助的是理解在什么情况下我会在F#代码中选择任务或PLINQ而不是异步工作流.我相信我读到任务并行库有更复杂的方法来平衡核心之间的负载.如果这是真的,那么对于需要并行操作的纯CPU绑定操作,Tasks可能是更好的选择.另一方面,PLINQ似乎主要是一种方便的方法来并行化与序列一起使用的现有代码.

最后,假设我对每种方法的优势的理解是正确的,将它们组合起来是否可行或可取?例如,也许可以从异步工作流中组合一系列操作,然后在执行之前将它们转换为Tasks.如果可能 - 甚至是个好主意.

f# multithreading

8
推荐指数
1
解决办法
1798
查看次数

Reactive Extensions(Rx)是否会取代任务并行库?

仔细阅读了Rx.NET样本后,我对于Reactive Extensions的概念和实现有多么精彩.它似乎为开发人员提供了一种更易于维护的模式,用于实现.NET 4.0的任务并行库提供的相同类型的多线程并行编码.

Rx.NET会取代TPL吗?应该是?

.net parallel-processing system.reactive

8
推荐指数
1
解决办法
2363
查看次数

所有这些Reactive Observable扩展之间的实际区别是什么?

给定一个BehaviorSubject,调用所有这些不同函数之间的实际区别是什么?

  • 第一()
  • 持续()
  • LatestValue()
  • MostRecentValue()
  • NextValue()
  • 单()
  • 以(1)

假设我理解正确,他们应该做同样的事情,给定BehaviorSubject.

如果是这样,那么哪个电话是最合适的(我的意思是:哪个最符合我的意图)?也许是第一个还是一个

如果没有,那么实际的差异是什么?

.net system.reactive

7
推荐指数
1
解决办法
696
查看次数

PLinq本质上比System.Threading.Tasks.Parallel.ForEach更快

简介:我从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太棒了!)

问题:

  1. 是否因为使用plinq vs Parallel.ForEach而加速?
  2. 它只是简单地删除并发数据结构(ConcurrentDictionary)?(因为它不需要同步线程).
  3. 根据这个相关问题的答案

PLINQ主要基于功能风格的编程而没有副作用,而副作用正是TPL的用途.如果你想实际并行工作而不是仅仅并行搜索/选择事物,你可以使用TPL.

我可以假设,因为我的模式基本上是功能性的(给输入产生没有突变的新输出),plinq是正确使用的技术吗?

我正在寻找验证我的假设是正确的,或者表明我错过了什么.

c# linq concurrency plinq task-parallel-library

7
推荐指数
1
解决办法
3456
查看次数

使用Reactive Extensions进行异步队列处理

有几篇关于此的文章,我有这个工作...但我想知道如何为我的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)

要安排我的保存...但是如何指定调度程序一次使用的最大线程数?

.net system.reactive

7
推荐指数
1
解决办法
4002
查看次数