跟踪以下进度的最佳方式是什么longtotal=Products.LongCount();longcurrent=0;doubleProgress=0.0;Parallel.ForEach(Products,product=>{try{varprice=GetPrice(SystemAccount,product);SavePrice(product,price);}finally{Interlocked.Decrement(refthis.current);}});我想将进度变量从0.0更新到1.0(当前/总计),但我不想使用任何会对并行性产生不利影响的东西。
我正试图围绕TPL数据流block中的“完成”进行思考。特别是,TransformBlock似乎从未完成。为什么?示例程序我的代码计算从1到1000的所有整数的平方。为此我使用了一个BufferBlock和一个TransformBlock。在我的代码后面,我等待TransformBlock完成。但是,该block从未真正完成,我不明白为什么。staticvoidMain(string[]args){varbufferBlock=newBufferBlock();varcalculatorBlock=newTransformBlock(i=>{Console.WriteLine("Cal
我正在尝试使用TPLDataflow实现数据处理管道.但是,我对数据流比较陌生,并不完全确定如何正确使用它来解决我要解决的问题。问题:我正在尝试遍历文件列表并处理每个文件以读取一些数据,然后进一步处理该数据。每个文件大概是700MB至1GB在尺寸方面。每个文件包含JSON数据。为了并行处理这些文件而不是运行内存,我正在尝试使用IEnumerable与yieldreturn然后进一步处理数据。获得文件列表后,我想同时处理最多4-5个文件。我的困惑来自:如何使用IEnumerable和yeildreturn与async/await和数据流。偶遇thisanswer通过svick,但仍然不确
我有一个带有“开始”和“停止”按钮的应用程序,以及一个在按下“开始”后在后台运行的线程。我为此使用MVC和TPL。我从不调用Wait()方法,如何处理TPL中的异常?在任何异常情况下,我都需要显示错误消息框,并且该框应该在它被立即抛出后显示。我一直在后台运行单线程,所以你不能在没有事先停止线程的情况下按开始。我正在寻找一些好的模式或最佳实践。我有一个想法将try..catch放在线程中,并在每次捕获时调用一个事件,但我不确定这种方法是否是好的架构决策 最佳答案 如果您正在使用Tasks,您可以添加一个仅在抛出异常时才运行的延续。您还
我创建这个是为了测试并行提取:publicstaticasyncTaskExtractToDirectoryAsync(thisFileInfofile,DirectoryInfofolder){ActionBlockblock=newActionBlock((entry)=>{varpath=Path.Combine(folder.FullName,entry.FullName);Directory.CreateDirectory(Path.GetDirectoryName(path));entry.ExtractToFile(path);},newExecutionDataflow
我们有一个托管的.Net/C#应用程序,它创建TPL任务以对JPEG图像执行JPEG元数据编码。每个任务都使用TaskCreationOptions.LongRunning选项构建,例如,Tasktask=newTask(()=>TaskProc(),cancelToken,TaskCreationOptions.LongRunning);TaskProc()利用JpegBitmapDecoder和JpegBitmapEncoder类添加JPEG元数据并将新图像保存到磁盘。我们允许最多2个这样的任务在任何时候处于事件状态,并且这个过程应该无限期地继续下去。执行上述操作一段时间后,我们得
我原来的方法是这样的:stringDoSomeWork();方法DoSomeWork在另一个线程上开始一些工作并返回执行ID(只是随机字符串)。稍后我可以通过返回的执行ID查询结果。要点是在作业完成之前使执行ID可用。现在我想更改签名以返回Task,这样用户可以根据需要等待。TaskDoSomeWork();与此同时,我仍然需要返回执行ID(例如用于跟踪目的)并且我看到了一些选项。首先,使用out参数,其次,返回包含执行ID和任务的元组(在C#中,这看起来不是最佳选择),第三,我实际上想问一下。如果我创建一个派生Task的类会怎样:publicclassExtendedTask:Tas
我想知道使用链接到一个或多个ActionBlock的BufferBlock是否有好处,除了节流(使用BoundedCapacity),而不是直接发布到ActionBlock(只要不需要节流)。 最佳答案 如果您只想将项目从一个block转发到其他几个block,则不需要BufferBlock。但在某些情况下它确实很有用。例如,如果您有一个复杂的数据流网络,您可能希望从较小的子网络构建它,每个子网络都以自己的方法创建。为此,您需要某种方式来表示一组block。在您提到的情况下,从该方法返回单个BufferBlock(可能作为ITarg
有些情况下我想有条件地运行任务。我使用这样的某种扩展方法:publicstaticclassMyTaskExtension{privatestaticTasktheEmptyTask=Task.Factory.StartNew(()=>{});//ThisisthequestionpublicstaticTaskContinueWith(thisTasktask,TaskcontinuationTask,Funccondition){ifcondition(){...dothework}returntheEmptyTask;}}我的期望是theEmptyTask已经完成,所以基本上如果
我最近听到了很多关于.NET4.0中的TPL的播客。它们中的大多数描述了后台事件,例如下载图像或进行计算,使用任务以使工作不会干扰GUI线程。我处理的大部分代码更多地具有多生产者/单一消费者的风格,其中来自多个来源的工作项必须排队,然后按顺序处理。一个例子是日志记录,其中来自多个线程的日志行被顺序排列到一个队列中,以便最终写入文件或数据库。来自任何单一来源的所有记录必须保持有序,并且来自同一时刻的记录在最终输出中应该彼此“接近”。所以多个线程或任务或任何东西都在调用队列:lock(_queue)//orusealock-freequeue!{_queue.enqueue(some_wo