Tag: task parallel library

Task.WhenAll()和foreach(任务中的var任务)之间的区别是什么

经过几个小时的挣扎,我在我的应用程序中发现了一个错误。 我认为下面的两个函数具有相同的行为,但事实certificate它们没有。 任何人都可以告诉我幕后真的发生了什么,以及他们为什么会以不同的方式行事? public async Task MyFunction1(IEnumerable tasks){ await Task.WhenAll(tasks); Console.WriteLine(“all done”); // happens AFTER all tasks are finished } public async Task MyFunction2(IEnumerable tasks){ foreach(var task in tasks){ await task; } Console.WriteLine(“all done”); // happens BEFORE all tasks are finished }

应用程序关闭时的任务处理

我有一个.Net(v4.0)Windows服务应用程序,它在开始时旋转一个tpl任务,执行某些长时间运行的活动,并且基本上在应用程序的生命周期内保持活动状态,因此使用TaskCreationOptions创建。 LongRunning参数值。 每当服务停止并且.OnStop()方法被调用时,我.Cancel()我在创建它时移交给工作任务的CancellationToken(Source)我想要它.OnlyOnCanceled(…)继续任务到跑。 问题是,服务/流程关闭而没有继续任务“完全”运行 – 有时它会相当快地退出,有时它会完全运行,有时则不会。 这对我来说是有意义的,因为该特定任务可能位于另一个线程而不是主线程上,因此无法“阻止”/阻止主要任务结束。 因为我在那个Windows服务应用程序中没有SynchronizationContext,所以我无法告诉延续任务在主线程上运行/所以我想知道:我该怎么做? 更确切地说,运行tpl任务处理应用程序关闭的最佳实践是什么?

TPL Dataflow如何删除块之间的链接

我想知道。 如何删除块之间的链接? 换一种说法。 我想要与LinkTo相反。 我想写一个基于tlp数据流的记录器。 我编写了这个接口,并希望在需要时删除ILogListener的订阅。 public interface ILogManager { void RemoveListener(ILogListener listener); }

如果没有标记为异步,Task.Delay是如何等待的?

我正在看Task.Delay(int)反编译的Task.Delay(int) : // System.Threading.Tasks.Task [__DynamicallyInvokable] public static Task Delay(int millisecondsDelay) { return Task.Delay(millisecondsDelay, default(CancellationToken)); } 使用此方法就像await Task.Delay(5000); ,intellisense甚至说“(等待)”: 那么如何将Task.Delay(int)标记为async ( public static async Task Delay(int millisecondsDelay) )?

这是正确的实施吗?

我有一个Windows服务需要从数据库中选择作业并需要处理它。 在这里,每项工作都是一个扫描过程,大约需要10分钟才能完成。 我是Task Parallel Library的新手。 我已通过以下方式实现为示例逻辑: Queue queue = new Queue(); for (int i = 0; i < 10000; i++) { queue.Enqueue(i); } for (int i = 0; i { var Objdata = (Queue)data; Console.WriteLine(Objdata.Dequeue()); Console.WriteLine( “The current thread is ” + Thread.CurrentThread.ManagedThreadId); }, queue, TaskCreationOptions.LongRunning); } Console.ReadLine(); 但是,这创造了很multithreading。 由于循环重复100次,因此创建了100个线程。 创建那么多并行线程是正确的方法吗? 有没有办法将线程数限制为10(并发级别)?

为什么Task的Result属性不可用于非generics任务(C#4.0+)?

我试图掌握.NET 4.0+任务并行库概念…… 在以下C#4.0代码段中: Task t = Task.Factory.StartNew(() => { Console.WriteLine(“I am the task”); return “res1”; }); 为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务: Task t = Task.Factory.StartNew(() => { Console.WriteLine(“I am the task”); return “res1”; }); 或者它(返回的对象)可以使用? 我是否正确理解,只有在检测或确保返回类型(ed对象)或t.Result时才需要Task 中的Task ? 或者除了这个之外还有其他隐藏的必需品吗? 为什么这种类型不能从返回对象的类型中确定? 也就是为什么任务的Result属性不可用于非通用任务?

Task.StartNew()vs Parallel.ForEach:多个Web请求场景

我已经阅读了SO中的所有相关问题,但对于我的场景中触发多个Web服务调用的最佳方法有点困惑。 我有一个聚合器服务,它接受输入,解析并将其转换为多个Web请求,进行Web请求调用(不相关,因此可以并行触发)并合并发送回调用者的响应。 现在使用以下代码 – list.ForEach((object obj) => { tasks.Add(Task.Factory.StartNew((object state) => { this.ProcessRequest(obj); }, obj, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default)); }); await Task.WhenAll(tasks); await Task.WhenAll(tasks)来自Scott Hanselman的post ,据说 斯蒂芬说:“从可扩展性的角度来看,更好的解决方案是利用异步I / O.当你通过网络呼叫时,没有理由(除了方便之外)在等待响应来阻止线程时背部” 现有代码似乎消耗了太multithreading,并且处理器时间在生产负载上达到100%,这让我思考。 另一个替代是使用Parallel.ForEach,它使用分区器,但也“阻塞”调用,这对我的场景来说很好。 考虑到这是所有“异步IO”工作而不是“CPU绑定”工作,并且Web请求不会长时间运行(最多返回3秒),我倾向于认为现有代码足够好。 但这会提供比Parallel.ForEach更好的吞吐量吗? Parallel.ForEach可能使用“最小”数量的任务,因为分区因此最佳使用线程(?)。 我用一些本地测试测试了Parallel.ForEach,但似乎没有更好。 目标是减少CPU时间并提高吞吐量,从而提高可扩展性。 是否有更好的方法来并行处理Web请求? 感谢任何投入。 编辑:代码示例中显示的ProcessRequest方法确实使用HttpClient及其异步方法来触发请求(PostAsync,GetAsync,PutAsync)。

并行地以顺序方式执行N个线程

我有一个应用程序,我有1个大文件的1000多个小部分。 我必须一次上传最多16个零件。 我使用.Net的Thread并行库。 我使用Parallel.For来划分多个部分并分配1个应该为每个部分执行的方法,并将DegreeOfParallelism设置为16。 我需要使用由不同部分上传生成的校验和值执行1方法,因此我必须设置某些机制,我必须等待所有部件上传说1000完成。 在TPL库中,我面临的问题是它是从1000中随机执行16个线程中的任何一个。 我想要一些机制,我可以在最初运行前16个线程,如果第一个或第二个或任何16个线程完成其任务,则应该启动第17个部分。 我怎样才能做到这一点?

如何生成任务以解包

有人可以解释这两个陈述之间的区别: Task bTask = backup.BackupCurrentDatabaseAsync() .ContinueWith(_ => CompressArchiveAsync()); //unwrap the tasks to produce one entire task Task t = bTask.Unwrap(); VS Task bTask = backup.BackupCurrentDatabaseAsync() .ContinueWith(_ => { CompressArchiveAsync(); }); //unwrap the tasks to produce one entire task Task t = bTask.Unwrap(); ExtractArchiveAsync() , BackupCurrentDatabaseAsync() , RestoreDatabaseAsync()都返回一个Task 。 这里,第一个Continuation返回一个Task 。 然后我可以Unwrap()这个任务,将Continuations放在结果(内部)任务上。 第二个版本不编译。 这里唯一不同的是CompressArchiveAsync()周围的大括号。 我试图访问结果(内部) Task以检查Task.Status […]

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

我在C#,VS2012,WPF 4.5中有以下代码。 我的期望是, .ContinueWith将在任务完成后执行(这是一个延续的完整目的,不是吗?)。 这应该在finalResult中产生值2。 int myTestInt = 0; Task task = Task.Factory.StartNew(async () => { myTestInt = 1; await Task.Delay(TimeSpan.FromSeconds(6)); myTestInt = 2; }).ContinueWith(_ => { int finalResult = myTestInt; }); 实际上, finalResult被赋值为1。 所以似乎已经在await语句上启动了continuation。 这是预期的行为吗? 我在这里错过了什么吗? 任务完成后我不能依赖ContinueWith启动吗? 更新: 贾斯汀的回答激发了我检查以下内容: int myTestInt = 0; Task task=Task.Factory.StartNew(async () => { myTestInt = 1; await Task.Delay(TimeSpan.FromSeconds(6)); myTestInt […]