控制SelectMany的最大线程数

时间:2015-06-25 20:56:44

标签: c# system.reactive reactiveui

我是否可以使用一种方法来设置IObservable.SelectMany的最大线程数?

以下代码非常适合在处理项目时更新UI,但我尝试执行的任务目前只是一点资源。我想将最大线程设置为两个,在资源使用上稍微轻一些。

AsyncCommand = ReactiveCommand.CreateAsyncObservable(_ => 
{
    // Set progress bar indicator to 0

    var set = new [] {...} // The set of items to process

    // Set the progress bar indicator max to the count of the items to process

    return set
        .ToObservable()
        .SelectMany((item, index) => Task.Run(() =>
        {
            // Process item

            return item;
        }), (item, index, processed) => item); 
});

AsyncCommand
    .ObserveOn(RxApp.MainThreadScheduler)
    .Subscribe(item => 
    {
        // Step the progress bar indicator
    });

2 个答案:

答案 0 :(得分:1)

Merge有一个最大并行度参数:

AsyncCommand = ReactiveCommand.CreateAsyncObservable(_ => 
{
    // Set progress bar indicator to 0

    var set = new [] {...} // The set of items to process

    // Set the progress bar indicator max to the count of the items to process

    return set
        .ToObservable()
        .Select(item => Observable.FromAsync(() => DoAsyncProcess(item))))
        .Merge(2);
});

另请参阅more advanced solution

答案 1 :(得分:0)

您的代码段中使用的

SelectMany本身不会引入任何并发,因此不会创建任何线程。它是TPL(因为你使用Task.Run)。 TPL通常不会创建太多线程来完成工作。如果您真的想要限制最大线程数,请查看here,然后查看here

作为一个简单的替代方案,请使用Stephen Cleary的精彩AsyncEx软件包中的AsyncSemaphore,并将处理代码放在WaitAsyncRelease个调用之间。