Tag: 任务并行库

MaxDegreeOfParallelism做什么?

我正在使用Parallel.ForEach,我正在做一些数据库更新,现在没有设置MaxDegreeOfParallelism,一个双核心处理器机器导致SQL客户端超时,其他四核心处理器机器不知何故超时。 现在,我无法控制运行代码的处理器内核的types,但是有些设置可以通过MaxDegreeOfParallelism更改,这样可能会同时运行更less的操作,并且不会导致超时? 我可以增加超时,但它不是一个好的解决scheme,如果在较低的CPU上,我可以同时处理较less的操作,这将减less对CPU的负载。 好吧,我也读过所有其他post和MSDN,但将MaxDegreeOfParallelism设置为较低的值,使我的四核心机器遭受? 例如,有没有办法做,如果CPU有两个核心,那么使用20,如果CPU有四个核心,然后40?

主窗口的SynchronizationContext.Current如何在Windows窗体应用程序中变为空?

我的应用程序中有一个问题:在某些时候,主线程的SynchronizationContext.Current变为空。 我无法在孤立的项目中重现相同的问题。 我真正的项目是复杂的, 它混合了Windows窗体和WPF,并调用WCF Web服务。 据我所知,这些都是可以与SynchronizationContext进行交互的系统。 这是我孤立项目的代码。 我真正的应用程序做类似的东西。 但是,在我的真实应用程序中,在继续执行任务时,主线程上的SynchronizationContext.Current为null。 private void button2_Click(object sender, EventArgs e) { if (SynchronizationContext.Current == null) { Debug.Fail("SynchronizationContext.Current is null"); } Task.Factory.StartNew(() => { CallWCFWebServiceThatThrowsAnException(); }) .ContinueWith((t) => { //update the UI UpdateGUI(t.Exception); if (SynchronizationContext.Current == null) { Debug.Fail("SynchronizationContext.Current is null"); } }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext()); } 什么可能导致主线程的SynchronizationContext.Current变为空? 编辑: @Hans要求堆栈跟踪。 这里是: […]

在C#中并行运行三种方法最简单的方法

我有三个方法,我打电话做一些数字计算,如下所示 results.LeftFront.CalcAi(); results.RightFront.CalcAi(); results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness); 每个函数都是相互独立的,可以并行计算,没有死锁。 在没有包含方法的情况下,并行计算这些方法最简单的方法是什么?

有没有一个通用的Task.WaitAll?

我开始几个并行的任务,像这样: var tasks = Enumerable.Range(1, 500) .Select(i => Task.Factory.StartNew<int>(ProduceSomeMagicIntValue)) .ToArray(); 然后join Task.WaitAll(tasks); 在最后一行,我得到一个蓝色波浪标记在tasks下,并带有警告信息: 从Task []到Task []的同variables数组转换 写操作可能导致运行时exception。 我明白为什么我会收到这个消息,但有没有办法解决这个问题呢? (例如,像Task.WaitAll()的通用版本?)

TPL和asynchronous/等待(线程处理)之间的区别

尝试理解TPL和asynchronous/等待线程创build之间的区别。 我相信TPL(TaskFactory.Startnew)类似于ThreadPool.QueueUserWorkItem,因为它在线程池中的线程上排队工作。 这当然,除非你使用TaskCreationOptions.LongRunning创build一个新的线程。 我认为asynchronous/等待将同样如此基本: TPL: Factory.StartNew( () => DoSomeAsyncWork() ) .ContinueWith( (antecedent) => { DoSomeWorkAfter(); },TaskScheduler.FromCurrentSynchronizationContext()); asynchronous/等待: await DoSomeAsyncWork(); DoSomeWorkAfter(); 将是相同的。 从我一直在读它看起来像asynchronous/只等待“有时”创build一个新的线程。 那么它什么时候创build一个新的线程,什么时候不创build一个新的线程呢? 如果你正在处理IO完成端口,我可以看到它不必创build一个新的线程,否则我会认为它将不得不。 我想我对FromCurrentSynchronizationContext的理解总是有点模糊。 我总是从头到尾都是UI线程。

将基于callback的asynchronous方法转换为等待任务的最佳方法

转换/包装使用callback的“经典”asynchronous方法返回(可等待的)任务的最佳方法是什么? 例如,给出以下方法: public void GetStringFromUrl(string url, Action<string> onCompleted); 我知道把这个包装成一个返回任务的方法的唯一方法是: public Task<string> GetStringFromUrl(string url) { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; } 这是完成这个的唯一方法吗? 有没有一种方法可以将调用包装到任务本身的GetStringFromUrl(url,callback)中(即调用本身将在任务内运行而不是同步)

正确的方式推迟任务的开始

我想安排一个任务,以x毫秒开始,并能够在开始之前取消它(或只是在任务开始时)。 第一次尝试会是这样的 var _cancelationTokenSource = new CancellationTokenSource(); var token = _cancelationTokenSource.Token; Task.Factory.StartNew(() => { token.ThrowIfCancellationRequested(); Thread.Sleep(100); token.ThrowIfCancellationRequested(); }).ContinueWith(t => { token.ThrowIfCancellationRequested(); DoWork(); token.ThrowIfCancellationRequested(); }, token); 但我觉得应该有一个更好的办法,因为这会在睡眠中用掉一根线,在此期间它可能被取消。 我的其他select是什么?

使用Task.Factory.StartNew传递一个方法参数

我有以下代码: var task = Task.Factory.StartNew(CheckFiles, cancelCheckFile.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); private void CheckFiles() { //Do stuff } 我现在想修改CheckFiles来接受整数和一个BlockingCollection引用 private void CheckFiles(int InputID, BlockingCollection<string> BlockingDataCollection) { //Do stuff } 我似乎无法find像上面那样开始执行此任务的方法。 你能帮我吗? 谢谢

如果使用带有大对象的枚举,Parallel.ForEach可能会导致“内存不足”exception

我试图迁移一个数据库,其中存储在数据库中的图像到数据库中的一条logging指向硬盘上的一个文件。 我正在尝试使用Parallel.ForEach来加快使用此方法查询数据的过程。 但是我注意到我正在得到一个OutOfMemoryexception。 我知道Parallel.ForEach将查询一批枚举types,以减less开销的代价,如果有一个用于间隔查询(所以如果你一次做了一堆查询,你的源代码更有可能将下一条loggingcaching在内存中把它们隔开)。 这个问题是由于我返回的logging是一个1-4Mb字节的数组,caching导致整个地址空间用完(程序必须以x86模式运行,因为目标平台将是32位机器) 有什么办法可以禁用caching或使TPL更小? 这里是一个示例程序来展示这个问题。 这必须在x86模式下进行编译,以显示问题,如果需要花费很长时间,或者在您的机器上没有发生问题,则会增加arrays的大小(我发现1 << 20在我的机器上需要大约30秒, 4 << 20几乎是瞬间的) class Program { static void Main(string[] args) { Parallel.ForEach(CreateData(), (data) => { data[0] = 1; }); } static IEnumerable<byte[]> CreateData() { while (true) { yield return new byte[1 << 20]; //1Mb array } } }

什么是使用C#.NET 4.0中的Task.Runreplace方法?

我得到这个程序,给我语法错误“System.Threading.Tasks.task不包含运行的定义。 我正在使用VB 2010 .NET 4.0有什么想法? 在.net 4.0中运行的任何替代? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ChatApp { class ChatProg { static void Main(string[] args) { Task<int> wakeUp = DoWorkAsync(2000,"Waking up"); Task.WaitAll(wakeUp); } static Task<int> DoWorkAsync(int milliseconds, string name) { //error appears below on word Run return Task.Run(() => { Console.WriteLine("* […]