Tag: 并行处理

TPL完成与完成

我需要从遗留数据库导入客户相关数据,并在此过程中执行多次转换。 这意味着单个条目需要执行其他“事件”(同步产品,创建发​​票等)。 我最初的解决方案是简单的并行方法。 它工作正常,但有时它有问题。 如果当前处理的客户需要等待相同类型的事件,他们的处理队列可能会卡住并最终超时,导致每个基础事件也失败(它们依赖于失败的事件)。 它不会一直发生,但它很烦人。 所以我有了另一个想法,分批工作。 我的意思不仅是限制同时处理的客户数量,还包括广播到队列的事件数量。 在寻找想法时,我找到了这个答案,它指向了TPL DataFlow 。 我制作了一个骨架来熟悉它。 我建立了一个简单的管道,但我对Complete()的使用和等待Completion()有点困惑。 步骤如下 制作一个数字列表(要导入的客户的ID) – 这是在导入逻辑之外,它只是在那里能够触发其余的逻辑 创建BatchBlock (以便能够同时限制要处理的客户数量) 基于id创建单个MyClass1项( TransformBlock ) 执行一些逻辑并生成MyClass2的集合( TransformManyBlock ) – 例如,睡眠1秒 对集合的每个项目执行一些逻辑( ActionBlock ) – 例如,hibernate1秒钟 这是完整的代码: public static class Program { private static void Main(string[] args) { var batchBlock = new BatchBlock(2); for (var i = 1; i […]

Parallel.ForEach错误HttpContext.Current

这个方法 – doDayBegin(item.BranchId)需要很长时间才能执行。 所以我使用Parallel.ForEach执行它。 当我使用正常的foreach循环时它的工作正常,但当我使用Parallel.ForEach它显示此错误 你调用的对象是空的。 public ActionResult Edit([DataSourceRequest] DataSourceRequest request) { try { JavaScriptSerializer js = new JavaScriptSerializer(); List _listDB0010020Vm = new List(); string dataDB0010020vm = Request.Form[“griddetailsvm”]; if (!string.IsNullOrEmpty(dataDB0010020vm)) { _listDB0010020Vm = js.Deserialize<List>(dataDB0010020vm). Where(d => d.IsValid == “YES”).ToList(); } DateTime start = DateTime.UtcNow; Parallel.ForEach(_listDB0010020Vm, item => { doDayBegin(item.BranchId); }); DateTime end = DateTime.UtcNow; TimeSpan […]

什么时候用哪个?

编辑其他选项和下面稍微扩展的问题。 考虑一个类体的这个人为的抽象例子。 它演示了执行“for”迭代的四种不同方法。 private abstract class SomeClass { public void someAction(); } void Examples() { List someList = new List(); //A. for for (int i = 0; i o.someAction()); //D. plinq someList.AsParallel().ForAll(o => o.someAction()); 编辑:从答案和研究中添加一些选项。 //E. ParallelEnumerable ParallelEnumerable.Range(0, someList.Count – 1) .ForAll(i => someList[i].someAction()); //F. ForEach Parallel Extension Parallel.ForEach(someList, o => o.someAction()); //G. For Parallel […]

如何更快地运行此entity framework示例

我有这个代码用于向数据库添加大约1500条记录: async void button7_Click(object sender, EventArgs e) { var task = await Task.Run(() => { Random rnd = new Random(); for (int i = 0; i <= 1500; i++) { db.Tbls.Add(new Tbl() { Name = "User" + i + 1, Num = rnd.Next(10, i + 10) / 10 }); progress.Report(i * 100 / 1500); } […]

C# – Parallel.Invoke和Parallel.ForEach本质上是一回事吗?

并且通过“同样的事情”我的意思是这两个操作基本上做同样的工作,它只是归结为哪个更方便根据你必须使用的工作进行调用? (即代表列表或迭代的事项列表)? 我一直在搜索MSDN,StackOverflow和各种随机文章,但我还没有找到一个明确的答案。 编辑: 我应该更清楚; 我问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法会更有效率。 示例:我有500个键值的列表。 目前我使用foreach循环遍历列表(连续)并执行每个项目的工作。 如果我想利用多个内核,我应该简单地使用Parallel.ForEach吗? 让我们说为了参数的缘故,我为这500个任务提供了500个代表的数组 – 是否会产生任何不同的调用Parallel.Invoke,给它一个500个代表的列表? 提前谢谢了!

C#事件:如何以并行方式处理事件

我有一个我希望以并行方式处理的事件。 我的想法是将每个回调添加到ThreadPool,effectivley有每个注册由ThreadPool处理的事件的方法。 我的试用代码如下所示: Delegate[] delegates = myEvent.GetInvocationList(); IAsyncResult[] results = new IAsyncResult[ delegates.Count() ]; for ( int i = 0; i < delegates.Count(); i++ ) { IAsyncResult result = ( ( TestDelegate )delegates[ i ] ).BeginInvoke( “BeginInvoke/EndInvoke”, null, null ); results[ i ] = result; } for ( int i = 0; i < delegates.Length; […]

多个线程将元素添加到一个列表。 为什么列表中的项目总是少于预期?

以下代码解释了我的问题。 我知道列表不是线程安全的。 但是这个潜在的“真实”原因是什么? class Program { static void Main(string[] args) { List strCol = new List(); for (int i = 0; i { AddElements(strCol); }).ContinueWith((t) => { WriteCount(strCol, id.ToString()); }); } Console.ReadLine(); } private static void WriteCount(List strCol, string id) { Console.WriteLine(string.Format(“Task {0} is done. Count: {1}. Thread ID: {2}”, id, strCol.Count, Thread.CurrentThread.ManagedThreadId)); } private […]

是否可以在执行Parallel.ForEach期间更改parallelOptions.MaxDegreeOfParallelism

我正在运行一个multithreading循环: protected ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = 2; Parallel.ForEach(items, parallelOptions, item => { // Loop code here }); 我想在执行并行循环期间更改parallelOptions.MaxDegreeOfParallelism以减少或增加一些线程。 parallelOptions.MaxDegreeOfParallelism = 5; 它似乎没有增加线程。 有没有人有任何想法?

Task.WaitAll方法与Parallel.Invoke方法

我有示例代码来比较Parallel方法和Task方法的处理时间。 这个实验的目标是了解它们是如何工作的。 所以我的问题是: 为什么Parallel工作得比Task快? 我的结果是否意味着我应该使用Parallel而不是Task? 我应该在哪里使用Task和Parallel? 使用Task与Parallel相比有什么好处? Task只是ThreadPool.QueueUserWorkItem方法的包装吗? public Task SomeLongOperation() { return Task.Delay(3000); } static void Main(string[] args) { Program p = new Program(); List tasks = new List(); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); var arr = tasks.ToArray(); Stopwatch sw = Stopwatch.StartNew(); Task.WaitAll(arr); Console.WriteLine(“Task wait all results: ” + sw.Elapsed); sw.Stop(); sw = […]

c#中异步和并行编程之间的关系是什么?

我感到困惑,因为异步编程是一种异步执行代码块的方法,它调用方法而不等待结果。 同样,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的。 所以想知道/混淆c#中这两种编程范式之间的关系是什么。