Tag: task parallel library

如何将.net 4.5 Async / Await示例转换回4.0

等效的asp.net mvc 4.0代码是什么样的? using System.Net; using System.Net.Http; using System.Web.Mvc; using System.Threading.Tasks; using Newtonsoft.Json; namespace Web.Controllers { public class HomeController : Controller { private HttpClient httpClient = new HttpClient(); private static dynamic shots; public async Task Index() { if (shots == null) { try { var responseMessage = await httpClient.GetAsync (“http://api.dribbble.com/shots/everyone?per_page=30”); responseMessage.EnsureSuccessStatusCode(); var value = await […]

使用Parallel.For令人失望的性能

我试图通过使用Parallel.For来加快我的计算时间。 我有一个带有8个内核的英特尔酷睿i7 Q840 CPU,但与顺序for循环相比,我只能获得4的性能比。 这是否与Parallel.For一样好,或者可以调整方法调用以提高性能? 这是我的测试代码,顺序: var loops = 200; var perloop = 10000000; var sum = 0.0; for (var k = 0; k < loops; ++k) { var sumk = 0.0; for (var i = 0; i < perloop; ++i) sumk += (1.0 / i) * i; sum += sumk; } 并行: sum = […]

Task.Run和Task.Factory.StartNew之间的exception处理不同

我在使用Task.Factory.StartNew并尝试捕获抛出的exception时遇到了一个问题。 在我的应用程序中,我有一个长期运行的任务,我想封装在Task.Factory.StartNew(.., TaskCreationOptions.LongRunning); 但是,当我使用Task.Factory.StartNew时,不会捕获exception。 然而,当我使用Task.Run ,它正如我所期望的Task.Run ,我认为它只是Task.Factory.StartNew一个包装器(根据例如这篇MSDN文章 )。 这里提供了一个工作示例,区别在于在使用Task.Run时将exception写入控制台,但在使用Factory.StartNew时则不会。 我的问题是: 如果我有一个可以抛出exception的LongRunning任务,我应该如何在调用代码中处理它们? private static void Main(string[] args) { Task t = RunLongTask(); t.Wait(); Console.WriteLine(t.Result); Console.ReadKey(); } private async static Task RunLongTask() { try { await RunTaskAsync(); } catch (Exception e) { Console.WriteLine(e); return false; } Console.WriteLine(“success”); return true; } private static Task RunTaskAsync() { //return Task.Run(async […]

Task.WaitAll不等待任务完成

在试图弄清楚新的时候(也许现在不是那么新,但对我而言是新的)C#中的Task异步编程,我遇到了一个问题,让我有点想弄清楚,我不知道为什么。 我已经解决了这个问题,但我仍然不确定为什么这是一个问题。 我以为我会分享我的经验,以防任何人遇到同样的情况。 如果有任何大师想告诉我这个问题的原因,那就太棒了,非常感激。 我总是喜欢知道为什么有些东西不起作用! 我做了一个测试任务,如下: Random rng = new Random((int)DateTime.UtcNow.Ticks); int delay = rng.Next(1500, 15000); Task<Task> testTask = Task.Factory.StartNew<Task>( async (obj) => { DateTime startTime = DateTime.Now; Console.WriteLine(“{0} – Starting test task with delay of {1}ms.”, DateTime.Now.ToString(“h:mm:ss.ffff”), (int)obj); await Task.Delay((int)obj); Console.WriteLine(“{0} – Test task finished after {1}ms.”, DateTime.Now.ToString(“h:mm:ss.ffff”), (DateTime.Now – startTime).TotalMilliseconds); return obj; }, […]

如何允许Taskexception传播回UI线程?

在TPL中,如果任务抛出exception,则捕获该exception并将其存储在Task.Exception中 ,然后遵循有关观察到的exception的所有规则。 如果它从未被观察过,它最终会在终结器线程上重新抛出并使进程崩溃。 有没有办法阻止任务捕获该exception,只是让它传播? 我感兴趣的任务已经在UI线程上运行(由TaskScheduler.FromCurrentSynchronizationContext提供 ),我希望exception能够转义,因此它可以由我现有的Application.ThreadException处理程序处理。 我基本上希望Task中未处理的exception在按钮单击处理程序中表现得像未处理的exception:立即在UI线程上传播,并由ThreadException处理。

链接两个函数() – >任务和A->任务

我不知道我是否以错误的方式思考TPL,但我很难理解如何获得以下内容: 我有两个function Task getA() { … } Task getB(A a) { … } 这似乎经常发生:我可以异步获得A.并且给定A,我可以异步获得B. 我无法弄清楚在TPL中将这些function链接在一起的正确方法。 这是一次尝试: Task Combined() { Task ta = getA(); Task<Task> ttb = ta.ContinueWith(a => getB(a.Result)); return ttb.ContinueWith(x => x.Result.Result); } ContinueWith是我感到困惑的地方。 返回的类型是“双任务”, Task<Task> 。 这在某种程度上对我来说似乎不对。 更新2011-09-30: 巧合的是,我找到了对Task<Task>进行操作的扩展方法TaskExtensions.Unwrap来给出一个Task 。 所以在我们得到C#5.0之前,我可以在这样的情况下执行ta.ContinueWith(a => …)。UnWrap(),其中continuation本身返回一个任务。

限制任务并行库中的线程数

我有几百个文件需要上传到Azure Blob存储。 我想使用并行任务库。 但是,如何在foreach文件列表中运行所有100个线程上传,我如何限制它可以使用的最大线程数并并行完成作业。 还是自动平衡事物?

使用System.Threading.Tasks.Parallel在线程池中创建新线程?

也许我不理解它…所有Parallel类问题:( 但是从我现在正在阅读的内容中,我了解到当我使用Parallel时,我实际上调动了threadPool中存在的所有线程以执行某些任务/任务。 例如 : var arrayStrings = new string[1000]; Parallel.ForEach(arrayStrings, someString => { DoSomething(someString); }); 因此,在这种情况下,Parallel.ForEach正在调动threadPool中存在的所有线程,用于’DoSomething’任务/任务。 但调用Parallel.ForEach会不会创建任何新线程? 很明显,没有1000个新线程。 但是我们假设有1000个新线程,有些情况下threadPool会释放它所拥有的所有线程,在这种情况下…… Parallel.ForEach会创建任何新线程吗?

C#TPL如何知道所有任务都完成了?

我有Loop生成任务。 码: Task task = null; foreach (Entity a in AAAA) { // create the task task = new Task(() => { myMethod(a); }, Token, TaskCreationOptions.None); task.Start(); } 正如你在每次迭代中看到的那样,任务对象有了新的初始化(.. new Task(()=> ..)我怎么知道所有的任务都完成了?

任务并行库 – 自定义任务计划程序

我要求将web服务请求发送到在线api,我认为Parallel Extensions非常适合我的需求。 有问题的Web服务旨在重复调用,但如果您每秒超过一定数量的呼叫,则会有一种机制向您收费。 我显然希望尽量减少我的收费,所以想知道是否有人见过可以应对以下要求的TaskScheduler: 限制每个时间跨度计划的任务数。 我想如果请求的数量超过这个限制那么它需要丢弃任务或可能阻止? (停止任务的后退日志) 检测相同的请求是否已经在要执行的调度程序中但尚未执行,如果是,则不对第二个任务进行排队,而是返回第一个任务。 人们是否觉得这些是任务调度员应该处理的责任,还是我在咆哮错误的树? 如果您有其他选择,我愿意接受建议。