相关疑难解决方法(0)

如何限制c#中的最大并行任务数

我有一个1000输入消息的集合来处理.我正在循环输入集合并为每个消息启动新任务以进行处理.

//Assume this messages collection contains 1000 items
var messages = new List<string>();

foreach (var msg in messages)
{
   Task.Factory.StartNew(() =>
   {
    Process(msg);
   });
 }
Run Code Online (Sandbox Code Playgroud)

我们可以猜测当时同时处理多少个最大消息(假设是普通的四核处理器),还是我们可以限制当时要处理的最大消息数?

如何确保以与Collection相同的顺序/顺序处理此消息?

.net c# asynchronous

28
推荐指数
4
解决办法
3万
查看次数

.Net TPL:具有任务优先级的有限并发级别任务调度程序?

我目前正在使用这里详细介绍的LimitedConcurrencyLevelTask​​Scheduler http://msdn.microsoft.com/en-us/library/ee789351.aspx

我想增强这一点,以便为个人任务分配优先权.这些优先级不需要映射到线程优先级.它应该只影响任务的启动顺序.

有谁知道这样一个任务调度程序的例子?(很多调度的东西都在我头上,所以如果有现有的解决方案会很棒)

.net c# task-parallel-library

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

.继续在任务完成之前开始

我在C#,VS2012,WPF 4.5中有以下代码.我的期望是,.ContinueWith将在任务完成后执行(这是一个延续的完整目的,不是吗?).

这应该导致值为2英寸finalResult.

int myTestInt = 0;

Task task = Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;

}).ContinueWith(_ =>
   {
      int finalResult = myTestInt;
   });
Run Code Online (Sandbox Code Playgroud)

实际上,finalResult被赋值为1.所以似乎await已经在声明中开始了延续.

这是预期的行为吗?我在这里错过了什么吗?ContinueWith任务完成后我不能依靠启动吗?

更新:

Justin的回答激发了我检查以下内容:

int myTestInt = 0;
Task task=Task.Factory.StartNew(async () =>
{
   myTestInt = 1;
   await Task.Delay(TimeSpan.FromSeconds(6));
   myTestInt = 2;
});

task.Wait();
int result2 = myTestInt;
Run Code Online (Sandbox Code Playgroud)

finalResult仍设置为1.是否无法可靠地等待包含awaits 的任务完成?

.net c# wpf task-parallel-library async-await

9
推荐指数
1
解决办法
2055
查看次数

有限并发TaskScheduler,可以交错要明确排序的任务

我正在寻找一个TaskScheduler:

  1. 允许我定义一些专用线程(例如8) - 标准LimitedConcurrencyLevelTaskScheduler(使用线程池线程)或WorkStealingTaskScheduler执行此操作.
  2. 允许我创建完全排序的子TaskScheduler,但是在父调度程序的专用线程上调度任务.

目前我们TaskScheduler.Default用于通用池(受线程池增长算法等的支配)以及new OrderedTaskScheduler()每当我们想要订购任务时.我想保持这种行为,但将这两个要求限制在我自己的专用线程池中.

QueuedTaskScheduler似乎非常接近.我认为QueuedTaskScheduler.ActivateNewQueue()返回子TaskScheduler的方法会在父级的工作池上执行IN ORDER任务,但似乎并非如此.子TaskSchedulers似乎具有与父级相同的并行化级别.

我不一定希望子任务调度程序任务优先于父任务调度程序任务(尽管它将来可能是一个很好的功能).

我在这里看到了一个相关的问题:有限的并发级别任务调度程序(具有任务优先级)处理包装的任务,但我的要求不需要处理异步任务(我的所有排队任务从头到尾完全同步,没有延续).

c# multithreading task parallel-extensions task-parallel-library

3
推荐指数
1
解决办法
1637
查看次数