Asynchronous 这个线程代码有解释吗?

Asynchronous 这个线程代码有解释吗?,asynchronous,task-parallel-library,system.reactive,Asynchronous,Task Parallel Library,System.reactive,因此,我们遇到了一些与此非常类似的代码。我只是想知道是否有人能给我解释一下 看看它是如何使用RX调度器的,然后是并行的 IDisposable subscription = someObservable.ObserveOn(ThreadPoolScheduler.Instance) .Subscribe(o => { Parallel.ForEach(xxxs, x =>

因此,我们遇到了一些与此非常类似的代码。我只是想知道是否有人能给我解释一下

看看它是如何使用RX调度器的,然后是并行的

    IDisposable subscription = someObservable.ObserveOn(ThreadPoolScheduler.Instance)
    .Subscribe(o =>
       {
           Parallel.ForEach(xxxs,
               x =>
               {
                   var theKey = x.Key;
                   if (!theTasks.ContainsKey(theKey) ||
                       theTasks.ContainsKey(theKey) && theTasks[theKey].IsCompleted)
                   {
                       theTasks[theKey] = Task.Factory.StartNew(
                           () =>
                           {
                               .....
                               }
                               catch (CommunicationObjectAbortedException ex)
                               {
                               ....
                               }
                               catch (ObjectDisposedException ex)
                               {
                               ....
                               }
                               catch (Exception e)
                               {
                               ....
                               }
                           });
                   }
               });
       },
       ex =>
       {
          ....
       },
       () =>
       {
          ....
       });
    } 
我知道所有这些事情单独做什么,但不确定这里的组合线程效果是什么。谁能猜一猜

啊,是的,是同时发生的

ThreadPoolScheduler
调度线程池上的工作,该线程池不同于任务池
ThreadPoolScheduler
用于在任务池不可用的平台上执行任务-如果可能,首选
TaskPoolScheduler

这感觉就像作者试图通过使用线程池为手头的任务保存任务池(请原谅这个双关语)

Parallel.ForEach
阻塞,直到循环完成。因此,当它在线程池上运行时,当发出新项时,对线程池中借用的线程执行下一个
ForEach

至于内部位,编写器希望每个唯一键运行一个
任务
,如果尚未运行。

啊,是的,并发性

ThreadPoolScheduler
调度线程池上的工作,该线程池不同于任务池
ThreadPoolScheduler
用于在任务池不可用的平台上执行任务-如果可能,首选
TaskPoolScheduler

这感觉就像作者试图通过使用线程池为手头的任务保存任务池(请原谅这个双关语)

Parallel.ForEach
阻塞,直到循环完成。因此,当它在线程池上运行时,当发出新项时,对线程池中借用的线程执行下一个
ForEach

至于内部位,编写器希望每个唯一键运行一个
任务
,如果该任务尚未运行