Tag: 并行处理

如何让UI线程等待信号量,但处理其他调度程序请求? (就像MessageBox.Show本身一样)

通常,当UI线程调用MessageBox.Show()类的东西时,当前代码执行不会继续,直到用户单击OK,但程序将继续运行在UI线程上调度的其他代码。 在这个问题中 ,我遇到了一个问题,就是在一次调用UI线程上调度了太多的委托。 我想在继续执行之前暂停某些点。 在我的新error handling程序中,我使用信号量来确保一次只处理一个错误。 我发送一个MessageBox来提醒用户,当他们点击“确定”时,我释放信号量,允许处理下一个错误。 问题是它没有按预期运行。 如果同时发生两次对HandleError的调度调用,则第一次调用MessageBox.Show,第二次调用UI线程。 奇怪的是,对MessageBox.Show()的调度调用永远不会被执行 – 整个应用程序只是挂起 – 所以当用户单击“确定”时应该释放的信号量被永久锁定。 这个解决方案缺少什么? private static ConcurrentDictionary QueuedErrors = new ConcurrentDictionary(); private static Semaphore Lock_HandleError = new Semaphore(1, 1); //Only one Error can be processed at a time private static void ErrorHandled(Exception ex) { DateTime value; QueuedErrors.TryRemove(ex, out value); Lock_HandleError.Release(); } private static bool […]

使用Task并行计算递归算法

如何使用任务将此顺序递归算法转换为并行递归算法? public static List s = new List(); // random integers, array size is n public static List p = new List(); // random integers, array size is n public static int n = 100; public static int w = 10; static void Main(string[] args) { G1(n, w) } private static int G1(int k, int […]

正确的方法做Parallel.For从Array计算数据

想:总和x和总和x * x。 其中x = line [i]。 因为多个线程想要读/写“sumAll”和“sumAllQ”,我需要锁定它的访问权限。 问题是锁定类型在这里序列化的东西。 我需要在#“Environment.ProcessorCount”中将此操作拆分为循环,每个循环对数组的一部分求和,最后将它们的结果相加。 但是我如何以编程方式进行编程呢? 示例代码: //line is a float[] Parallel.For(0, line.Length, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, i => { x = (double)line[i]; lock (sumLocker) { sumAll += x; sumAllQ += x * x; } }); 编辑1:Matthew Watson回答基准测试结果 在家。 CPU Core 2 Quad Q9550 @ 2.83 GHz: […]

CPU绑定任务的并行化继续IO绑定

我正在试图找到一种很好的方法来进行大数据集处理的代码并行化,然后将结果数据导入RavenDb。 数据处理受CPU限制,数据库导入IO绑定。 我正在寻找一个解决方案,在Environment.ProcessorCount线程上并行处理。 然后,应将结果数据导入到x(简称10)池中的RavenDb中并行处理上述过程。 这里的主要内容是我希望在导入完成数据时继续处理,以便在等待导入完成时继续处理下一个数据集。 另一个问题是成功导入后需要丢弃每批的内存,因为私有工作内存可以轻松达到> 5GB。 下面的代码是我到目前为止所得到的。 请注意,它没有满足上面列出的并行化要求。 datasupplier.GetDataItems() .Partition(batchSize) .AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .ForAll(batch => { Task.Run(() => { … } } GetDataItem生成分区为批处理数据集的可枚举数据项。 GetDataItem将产生约2,000,000个项目,每个项目平均大约0.3ms进行处理。 该项目在x64平台上运行在最新的.NET 4.5 RC上。 更新。 我当前的代码(见上文)将获取项目并批量分区。 每个批处理在八个线程上并行处理(i7上的Environment.ProcessorCount)。 处理速度慢,CPU限制和内存密集。 完成单个批处理后,将启动一个任务,将结果数据异步导入RavenDb。 批量导入作业本身是同步的,如下所示: using (var session = Store.OpenSession()) { foreach (var data in batch) { session.Store(data); } session.SaveChanges(); } 这种方法存在一些问题: 每次批处理完成时,都会启动任务以运行导入作业。 我想限制并行运行的任务数量(例如,max 10)。 此外,即使启动了许多任务,它们似乎也不会并行运行。 内存分配是一个巨大的问题。 […]

调用并行化foreach的问题

我在使用System.Threading.Tasks.Parallel.ForEach时遇到问题。 身体foreach progressBar想要更新。 但Invoke方法有时会冻结。 我将代码附加到prograssbar和Buton的表单中。 private void button1_Click(object sender, EventArgs e) { DateTime start = DateTime.Now; pforeach(); Text = (DateTime.Now – start).ToString(); } private void pforeach() { int[] intArray = new int[60]; int totalcount = intArray.Length; object lck = new object(); System.Threading.Tasks.Parallel.ForEach(intArray, () => 0, (x, loop, count) => { int value = 0; System.Threading.Thread.Sleep(100); […]

线程获得100%CPU非常快

我在C#中实现了一个非常基本的线程: private Thread listenThread; public void startParser() { this.listenThread = new Thread(new ThreadStart(checkingData)); this.listenThread.IsBackground = true; this.listenThread.Start(); } private void checkingData() { while (true) { } } 然后我立即获得100%的CPU。 我想检查传感器数据是否在while(true)循环内读取。 为什么会这样? 提前致谢。

有没有理由锁定除new object()之外的东西?

object theLock = new object(); … lock (theLock) { … } 我总是使用一个new object() ,但我想知道:在任何情况下你会锁定一个更具体的类型?

并行EventHandler

我希望毫不拖延地同时通知我class级的活动订阅者。 我应该滚动自己的事件处理程序; 使用FCL中的一些支持并行性; 或默认内置System.EventHandler支持这种事件通知方式?

在ASP.NET中并行执行.NET HttpWebRequests的建议

我有一个ASP.NET MVC Web应用程序,可以对其他服务器进行REST样式的Web服务调用。 我有一个场景,我正在对两个单独的服务进行两次HttpWebRequest调用。 我需要他们两个完成继续,但他们的顺序无关紧要。 它们可能每个需要1-2秒,我现在按顺序运行它们。 并行运行会减少用户响应时间,但最好的方法是什么? 在研究这个时,我可以想到几个选择: 在主线程上执行一个请求,并为另一个请求启动第二个线程。 应该创建新线程还是使用线程池? 如果我使用游泳池,我该如何调整尺寸? 另外,不知道如何将线程重新连接在一起(例如使用ThreadPool.RegisterWaitForSingleObject )? 尝试并利用内置的IAsyncResult支持一个或两个请求。 同样,不确定异步请求在哪些线程上执行,因此不确定如何调整线程池的大小。 如何将IAsyncResult加入我的主线程? 所有的例子我都在回调中找到了进程信息,但是我可以在主线程中等待并使用IsCompleted属性? 我需要找到一个既能运作又能大规模运行的解决方案。 这就是我担心线程池大小的原因。 我不愿意阻止请求,因为他们正在等待可用的线程。

如何获得任务并行库使用的最大并行度?

我想使用Parallel.invoke。 如果我分配20个并行任务,则只有8个并发运行。 我的CPU是http://ark.intel.com/products/47925 ,报告的线程数是8.我假设可以并行运行的任务数与线程的cpu数有关。 我不想创建比线程数更多的任务。 我怎么知道c#中的线程数? 我尝试查询ParallelOptions.MaxDegreeOfParallelism,我得到的只是-1。