Tag: 并行处理

按顺序拆分Parallel.Foreach循环上的负载

我在列表中有一百万个要处理的元素。 将它们粗略地放入Parallel.ForEach只会使CPU饱和。 相反,我将元素主列表拆分为多个部分,并将子列表放入并行循环中。 List MasterList = new List(); Populate(MasterList); // puts a Million elements into list; //Split Master List into 100 Lists of 10.0000 elements each List<List> ListOfSubLists = Split(MasterList,100); foreach (List EL in ListOfSubLists ) { Parallel.ForEach(EL, E => { // Do Stuff } //wait for all parallel iterations to end before continuing } […]

同时运行两个代码c#

我在我开发的应用程序中遇到这种情况,我需要在同一时间完成两件事情,我有点挣扎。 我正在开发相机应用程序,我需要在LED的同时触发相机以获得良好的图像。 以下是我尝试过的选项。 使用两个线程: Thread t1 = new Thread( new ThreadStart(() => { //trigger LED here })); Thread t2 = new Thread( new ThreadStart(() => { //trigger camera })); t1.Start(); t2.Start(); t1.Join(); t2.Join(); 在单独的线程上触发当前线程和摄像机上的指示灯 Thread t = new Thread( new ThreadStart(() => { //trigger camera })); // trigger LED t.Start(); t.Join(); 在这两种情况下,我都会像10张图像一样闪烁,这意味着相机和LED不同步。 我的问题是,有没有办法实现我想要做的事情。 谢谢。

将事务范围添加到Parallel.Foreach

我有一个循环将记录插入数据库(Firebird): using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { taskList.Add(Task.Factory.StartNew(() => { Parallel.ForEach(objectList, c => { DoInsert(c, id); }); })); scope.Complete() } 如果插入失败,我希望能够批量回滚这些插入。 但是,当我在Parallel.Foreach循环中执行插入时,事务范围不可见。 我假设那是因为循环在不同的线程中运行。 如果我使用TransactionScope作为串行插入执行此操作,一切正常。 我试图使用DependentTransaction但我似乎无法获取DoInsert函数的上下文。 DoInsert只是打开一个连接并将C的内容写入数据库。 有任何想法吗? 谢谢,

TaskFactory.Tasks中BlockingCollection.GetConsumingEnumerable()集合的Parallel.ForEach和foreach循环

我已经尝试了这两个循环,并注意到即使Task的Action委托中的常规foreach循环应该并行执行,它也不会并行处理元素。 但是,如果我用Parallel.ForEach替换它,我会看到数据正在跨多个线程并行处理。 代码1: Task loadingTask1 = Factory.StartNew(() => { foreach (MyOneClass dg in Queue.GetConsumingEnumerable()) { MyOtherClass vl = new MyOtherClass(); vl.Id = dg.Id; vl.PerformTimeConsumingAction(); OutputQueue.Add(vl); } }); 代码2: Task loadingTask2 = Factory.StartNew(() => { Parallel.ForEach(Queue.GetConsumingEnumerable(), (dg) => { MyOtherClass vl = new MyOtherClass(); vl.Id = dg.Id; vl.PerformTimeConsumingAction(); OutputQueue.Add(vl); }); }); 在每次迭代时使用Console.Write语句运行的代码1似乎等待上一个循环完成,直到它抓住下一个循环,但代码2确实并行处理多个元素。 我是否正确理解Task.Action中的常规foreach? 我认为.NET将启动尽可能多的任务线程作为加载保证,并且每个迭代的foreach将被并行处理。 我也尝试将PLINQ结果传递给上述两个代码和观察者相同的行为:常规foreach似乎等待上一次迭代完成以启动下一个代码,即使我使用过.AsParallel()和.WithExecutionMode(ParallelExecutionMode.ForceParallelism)指令。 任何见解都将受到高度赞赏。 […]

并行。失败(C#)

我写了一些代码: class Program { public const int count = 3000; static List list = new List(); static void DoWork(int i) { list.Add(i); } static void Main(string[] args) { while (true) { Stopwatch s = new Stopwatch(); s.Start(); Parallel.For(0, count + 1, DoWork); s.Stop(); Console.WriteLine(“\n Elapsed: ” + s.Elapsed.ToString()); Console.WriteLine(“Expected: {0}”, count + 1); Console.WriteLine(“count: {0}”, […]

lambda表达式是multithreading的吗?

lambda表达式是multithreading的吗? 说当你把数学公式写成lambda方法时,当你把它传递给另一个方法时,它会是multithreading的吗?

设置要在Parallelism中使用的核心

我觉得这个问题的答案是否定的,但是使用.Net 4.0的Parallelism,你可以设置运行的核心数量,即如果你运行的是四核,你可以设置你的应用程序只使用其中的2个? 谢谢

异步保存数据库或在.net c中并行保存记录#

我有一项服务,我必须在从API获取后将大量记录保存到数据库。 同时我必须将这些记录从服务返回给调用者。 但问题是我在DB中保存记录需要很长时间,因此服务变慢。 我搜索了这个并发现了一些并行任务或异步等待的概念。 我是这个概念的新手,并且对它的使用感到困惑 我调查了一下: 运行多个C#任务异步 http://msdn.microsoft.com/en-us/library/hh191443.aspx 但我不知道该怎么做。请帮助我: 下面是代码: public List SearchItems(string ItemToSearch, string AuthenticationToken) { var _list= getRecords from Api //100 records //Task.Factory.StartNew(() => _objBLLNutritionLog.FillNutritionTable(_tempList)); // also tried this saveToDb(_list); // need to run this asynchronously Or parallel (Taking long time) return _list; } 我想将结果返回给调用者,另一方面想要填充db。 请建议。 谢谢

Parallel.For使用step!= 1

有没有办法实现这个for循环的Parallel.For版本? for (int i = 0; i < 100; i += 2) { DoStuff(i); } 我没有看到接受步骤参数的重载,但我想不出任何理由这在逻辑上是不可能的。 对此和此问题的接受答案建议在使用Enumerable.Range生成的一系列int上使用Parallel.ForEach ,但在我的情况下,我使用线程本地数据, 因此Parallel.ForEach不是一个选项 。 另一种选择是检查我的循环体中是否i % 2 == 0并return ,但这仍然执行线程本地数据初始化器Func和终结器Func 。 以下是演示此选项的代码段: Parallel.For(0, limit, () => new Bar(), //thread local data initialize (i, state, local) => //loop body { if (i % 2 != 0) return local; local.foo += […]

随机生成数字1超过90%并行

考虑以下程序: public class Program { private static Random _rnd = new Random(); private static readonly int ITERATIONS = 5000000; private static readonly int RANDOM_MAX = 101; public static void Main(string[] args) { ConcurrentDictionary dic = new ConcurrentDictionary(); Parallel.For(0, ITERATIONS, _ => dic.AddOrUpdate(_rnd.Next(1, RANDOM_MAX), 1, (k, v) => v + 1)); foreach(var kv in dic) Console.WriteLine(“{0} […]