Tag: task parallel library

IO绑定操作的并行执行

我已阅读TPL和任务库文档封面。 但是,我仍然无法清楚地理解以下情况,现在我需要实施它。 我会简化我的情况。 我有一个长度为1000的IEnumerable 。我必须使用HttpClient向它们发出请求。 我有两个问题。 没有太多计算 ,只是在等待Http请求。 在这种情况下,我还可以使用Parallel.Foreach()吗? 如果使用Task ,创建大量的最佳实践是什么? 假设我使用Task.Factory.StartNew()并将这些任务添加到列表中并等待所有这些任务。 是否有一个function(如TPL分区程序)控制最大任务的数量和我可以创建的最大HttpClient ? 在SO上有几个类似的问题,但没有人提到最大值 。 该要求仅使用具有最大HttpClient的最大任务。 先感谢您。

Parallel.Invoke不等待异步方法完成

我有一个应用程序从不同的来源提取相当数量的数据。 本地数据库,网络数据库和Web查询。 任何这些都可能需要几秒钟才能完成。 所以,首先我决定并行运行这些: Parallel.Invoke( () => dataX = loadX(), () => dataY = loadY(), () => dataZ = loadZ() ); 正如预期的那样,所有三个并行执行,但是在最后一个块完成之前,整个块上的执行都不会返回。 接下来,我决定在应用程序中添加一个微调器或“忙指示器”。 我不想阻止UI线程或者微调器不会旋转。 所以这些需要在async模式下运行。 但是如果我在异步模式下运行所有​​三个,那么它们的影响就会“同步”发生,而不是与UI在同一个线程中。 我仍然希望他们并行运行。 spinner.IsBusy = true; Parallel.Invoke( async () => dataX = await Task.Run(() => { return loadX(); }), async () => dataY = await Task.Run(() => { return loadY(); }), […]

如何在.net 3.5中获得等效的Task ?

我有一些使用Task代码,它推迟了短时间内从串行读操作返回结果,如下所示: void ReturnResponseAfterAShortDelay() { if (delayedResponseCancellationTokenSource != null) delayedResponseCancellationTokenSource.Cancel(); // Cancel any pending operations and start a new one. delayedResponseCancellationTokenSource = new CancellationTokenSource(); log.InfoFormat(“Deferring response for {0} ms”, Settings.Default.TimeoutMs); Task.Delay(Properties.Settings.Default.TimeoutMs, delayedResponseCancellationTokenSource.Token) .ContinueWith((continuation) => ReturnWhateverHasArrived(), TaskContinuationOptions.NotOnCanceled) .Start(); } 此代码背后的想法是在没有新字符到达指定间隔时返回结果。 但是,由于我无法控制的因素,我必须使用.NET 3.5,这会阻止我使用Task ,因此我必须以某种方式重构此代码。 如何在不使用Task情况下实现相同的结果? 澄清 虽然我展示的具体代码恰好是一个定时延迟,但我的用法并不仅限于延迟。 可能还有其他情况我想立即启动一些“长时间运行”的轮询任务。 典型情况是I / O绑定操作,例如,定期查询连接到串行端口的设备,然后在满足某些条件时引发事件。

在Task.Run中使用CancellationToken超时不起作用

好的,我的问题非常简单。 为什么这段代码不会抛出TaskCancelledException ? static void Main() { var v = Task.Run(() => { Thread.Sleep(1000); return 10; }, new CancellationTokenSource(500).Token).Result; Console.WriteLine(v); // this outputs 10 – instead of throwing error. Console.Read(); } 但是这个有效 static void Main() { var v = Task.Run(() => { Thread.Sleep(1000); return 10; }, new CancellationToken(true).Token).Result; Console.WriteLine(v); // this one throws Console.Read(); }

支持.NET 4.0“任务并行库”中的进度报告和增量结果

我知道任务并行库仍处于测试阶段,并且可能有更少的资源可用,但是从我读过的内容来看,库为任务调度 , exception处理和取消提供了非常特殊的处理。 但我没有找到任何关于进度报告和从任务发送增量结果的引用。 这两件事似乎太重要了,不容忽视。 您能否详细介绍如何在任务并行库中处理这些内容或参考一些解释它们的文章?

.net 4.5中的异步和同步之间的区别

在我阅读.Net 4.5 async异步编程和await关键字时,我在这里阅读以下段落 处理异步请求 在启动时看到大量并发请求或具有突发性负载(并发性突然增加)的Web应用程序中,使这些Web服务调用异步将提高应用程序的响应能力。 异步请求与同步请求相同的处理时间。 例如,如果请求进行需要两秒钟完成的Web服务调用,则无论是同步执行还是异步执行,请求都需要两秒钟 。 但是,在异步调用期间,在等待第一个请求完成时,不阻止线程响应其他请求。 因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。 对于粗体字,我无法理解它们异步请求如何处理同步请求需要相同的时间? 例如: public async Task MyMethod() { Task longRunningTask = LongRunningOperation(); //indeed you can do independent to the int result work here //and now we call await on the task int result = await longRunningTask; //use the result Console.WriteLine(result); } public async Task LongRunningOperation() // […]

如何等待有条件的任务?

我有一些任务返回一个布尔。 我只想等到任何任务首先返回True时。 可能吗 ? 我的第一个想法是使用CancellationTokenSource,但它不是一个好主意,因为它在我调用Task.WaitAll方法时抛出exception。 第二个选项是使用我在参考中传递的bool,如果是,则直接返回。 它有效,但它不是高效的: bool isFound = false; Task t0 = Task.Factory.StartNew(() => Find(paramA, paramB, ref isFound)); Task t1 = Task.Factory.StartNew(() => Find(paramC, paramD, ref isFound)); Task t2 = Task.Factory.StartNew(() => Find(paramE, paramF, ref isFound)); Task t3 = Task.Factory.StartNew(() => Find(paramG, paramH, ref isFound)); Task.WaitAll(new Task[] { t0, t1, t2, t3, t4 […]

平行斐波纳契数计算器

我正在使用任务并行库(TPL)来计算斐波纳契数。 计划如下: public static int Fib(int n) { if (n <= 1) { return n; } Task task = Task.Factory.StartNew(() => Fib(n – 1)); var p = Fib(n – 2); return task.Result + p; } public static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); Console.WriteLine(“Answer: ” + Fib(44)); watch.Stop(); Console.WriteLine(“Time: ” + […]

等待单个任务更清楚地从List <Task >中失败,可能使用LINQ?

在我的应用程序中,我有一个List<Task> ,我在Task.Wait[..]上确定它们是否成功完成( Result = true )。 虽然如果在我等待一个Task完成并返回一个假值,我想取消我正在等待的所有其他Task并根据此做一些事情。 我创建了两个“丑陋”的方法来做到这一点 // Create a CancellationToken and List<Task> to work with CancellationToken myCToken = new CancellationToken(); List<Task> myTaskList = new List<Task>(); //– Method 1 — // Wait for one of the Tasks to complete and get its result Boolean finishedTaskResult = myTaskList[Task.WaitAny(myTaskList.ToArray(), myCToken)].Result; // Continue waiting for Tasks to […]

如何衡量等待异步操作的性能?

我有一个从多个MessageQueue实例读取的Windows服务。 这些消息队列都运行自己的Task来读取消息。 通常,在阅读消息后,I / O数据库的工作就完成了。 我发现文章声称在I / O操作上使用异步是个好主意,因为它可以释放线程。 我正在尝试模拟在控制台应用程序中使用异步I / O操作的性能提升。 控制台应用程序 在我的测试环境中,我有10个队列。 GetQueues()返回10个不同的MessageQueue实例。 static void Main(string[] args) { var isAsync = Console.ReadLine() == “Y”; foreach (var queue in queueManager.GetQueues()) { var temp = queue; Task.Run(() => ReceiveMessagesForQueue(temp, isAsync)); } while (true) { FillAllQueuesWithMessages(); ResetAndStartStopWatch(); while(!AllMessagesRead()) { Thread.Sleep(10); } Console.WriteLine(“All messages read in {0}ms”, stopWatch.ElapsedMilliseconds); […]