Tag: 并行处理

C#中的并行编程

我有兴趣了解C#.NET中的并行编程(不是所有要知道的东西,而是基础知识,也许是一些好的实践),因此我决定重新编程我的一个名为ImageSyncer的旧程序。 ImageSyncer是一个非常简单的程序,它所做的只是扫描一个文件夹,找到以.jpg结尾的所有文件,然后根据它们的拍摄日期计算文件的新位置(解析xif数据,或者其他它被称为)。 在生成位置之后,程序检查该位置的任何现有文件,如果存在,则查看要复制的文件的最后写入时间和文件“以其方式”。 如果它们相等,则跳过该文件。 如果不是,则创建并匹配两个文件的md5校验和。 如果没有匹配,则要为要复制的文件指定要复制到的新位置(例如,如果要将其复制到“C:\ test.jpg”,则将其复制到“C:\ test(1)”。 jpg“而不是”。 此操作的结果将填充到包含两个字符串的struct-type队列中,即原始文件和要将其复制到的位置。 然后迭代该队列,直到它为空并且复制文件。 换句话说,有4个操作: 1. Scan directory for jpegs 2. Parse files for xif and generate copy-location 3. Check for file existence and if needed generate new path 4. Copy files 因此,我想重写这个程序,使其成为并列,并能够同时执行多个操作,我想知道实现这一目标的最佳方法是什么。 我想出了两个我能想到的不同模型,但它们中的任何一个都没有任何好处。 第一个是并行化旧程序的4个步骤,以便当要执行第一步时,它在几个线程上完成,并且当完成整个步骤1时,开始步骤2。 另一个(我发现它更有趣,因为我不知道如何做到这一点)是创建一种工作者和消费者模型,所以当一个线程完成步骤1时,另一个接管并执行第2步对象(或类似的东西)。 但如上所述,我不知道这些是否有任何好的解决方案。 另外,我对并行编程一点都不太了解。 我知道如何创建一个线程,以及如何使它执行一个以对象作为唯一参数的函数,并且我也曾经使用过BackgroundWorker类,但我对它们中的任何一个都不熟悉。 任何输入将不胜感激。

如何根据最佳实践在C#4中创建异步方法?

请考虑以下代码段: public static Task FetchAsync() { string url = “http://www.example.com”, message = “Hello World!”; var request = (HttpWebRequest)WebRequest.Create(url); request.Method = WebRequestMethods.Http.Post; return Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null) .ContinueWith(t => { var stream = t.Result; var data = Encoding.ASCII.GetBytes(message); Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null, TaskCreationOptions.AttachedToParent) .ContinueWith(t2 => { stream.Close(); }); }) .ContinueWith(t => { var t1 = […]

Task.WhenAll结果排序

我从这里了解到Task.Whenall的任务执行顺序不是确定性的,但我找不到任何有关结果顺序的信息。 结果集合是否按照输入中排序的任务或结果的顺序包含结果? 从我做的测试来看,它似乎保留了订单,但我需要确认。

嵌套的Parallel.For()循环速度和性能

我有一个嵌套的for循环。 我用Parallel.For()替换了第一个For,并且计算速度提高了。 我的问题是用Parallel.For()替换第二个(在一个内部Parallel.For() 。 它会提高速度吗? 还是没有区别? 还是会慢一点? 编辑: 由于内核不是无限制的(通常有2到8个内核),内部循环并行运行。 所以,如果我用Parallel.For()更改内部,它再次并行运行。 但我不确定它如何改变性能和速度。

List 是否可以读取线程安全?

以下伪代码是否是线程安全的? IList dataList = SomeNhibernateRepository.GetData(); Parallel.For(..i..) { foreach(var item in dataList) { DoSomething(item); } } 列表永远不会被更改,它只是迭代并且并行读取。 没有写字段或类似的东西。 谢谢。

并行的foreach循环 – 奇怪的行为

下面的代码只是创建一个List> of random numbers,然后计算并行foreach循环中每个列表的累积和。 为什么我得到的数字少于’numLists’? 通常在9990左右。我猜它与线程安全有关。 什么是替代方法? (我是C#初学者,所以希望我使用正确的术语)谢谢。 using System; using System.Collections.Generic; using System.Threading.Tasks; namespace testParallelForeach { class Program { static void Main(string[] args) { List<List> bsData = new List<List>(); List<List> cumsumDataP = new List<List>(); int numLists = 10000; int myLen = 400; Random rand = new Random(); for (int i = 0; i < […]

C#:向ASP.NET中的Parallel.ForEach()添加上下文

我有一个带静态get属性的静态类,在这个属性中,我这样做: // property body { // HttpContext.Current is NOT null … Parallel.ForEach(files, file => { // HttpContext.Current is null var promo = new Promotion(); … }); … // HttpContext.Current is NOT null } 在视图使用此属性之前,此静态类不会进行类型初始化。 问题是,在Parallel.ForEach()创建new Promotion()时初始化的Promotion的静态构造函数使用HttpContext.Current 。 当promo在此Parallel.ForEach()的范围内实例化时, HttpContext.Current为null ,因此new Promotion()会导致exception。 HttpContext.Current在静态get属性中不为null,因为在视图使用它之前不会调用它(因此它有一个HttpContext.Current )。 如果Promotion在其实例中使用HttpContext.Current而不是静态成员,我可能只是将HttpContext.Current传递给new Promotion()构造函数: var context = HttpContext.Current; Parallel.ForEach(files, file => { var promo […]

C#中的每线程内存管理

继续从了解VS2010 C#并行分析结果的讨论,但更重要的是: 我有许多并行工作的线程(使用Parallel.For / Each),它们为小类使用许多内存分配。 这会在全局内存分配器线程上产生争用。 有没有办法指示.NET为每个线程预分配内存池并从该池中进行所有分配? 目前我的解决方案是我自己的内存池实现(全局分配的T类对象数组,它们在线程中循环使用),这有很大帮助,但效率不高,因为: 我不能指示.NET从特定的内存片分配。 我仍然需要多次调用new来为池分配内存。 谢谢, 哈

为什么Parallel.ForEach不运行多个线程?

今天我尝试对foreach语句进行一些优化,这适用于XDocument 。 优化前: foreach (XElement elem in xDoc.Descendants(“APSEvent”).ToList()) { //some operations } 优化后: Parallel.ForEach(xDoc.Descendants(“APSEvent”).ToList(), elem => { //same operations }); 我在Parallel.ForEach(…)看到.NET只打开了一个线程! 因此, Parallel的时间跨度大于标准foreach 。 为什么你认为.NET只开了1个线程? 因为锁定文件? 谢谢

多个线程从同一个文件读取

我有一个需要多次读取的xml文件。 我正在尝试使用Parallel.ForEach来加速这个过程,因为没有读入的数据与它被读入的顺序有关。数据只是用于填充对象。 我的问题是即使我每次在线程中打开文件只读它抱怨它是由另一个程序打开。 (我没有在文本编辑器中打开它或任何东西:)) 如何从同一个文件中完成多次读取? 编辑:文件大约是18KB。 它读取大约1800次。 谢谢