Tag: 并行处理

并行调用方法并组合结果

我有一个MainMethod需要调用两个方法Method1和Method2并行。 它们都将从不同的数据库返回Employee列表。 我需要将它们称为并行,然后在MainMethod中组合Method1和Method2的结果,然后将结果返回给MainMethod的调用者。 我非常感谢人们能说出必须签名的方法和我需要编写的代码是什么意思是async / await关键字。

.Net(C#)异步x并行性能

.Net对异步和并行编程很有帮助。 有一些关于这方面的好文章 但什么是最好的和在哪种情况下? 我刚刚创建了一个简单的控制台应用程序来试图找出答案。 它看起来像异步和等待更快,但它消耗更多的内存。 这是在同一台机器上重复测试三次的平均结果(CPU = AMD FX 8120八核处理器3,1GHz和RAM = 16GB): 异步经过时间= 23,0841498667 | 记忆(MB)= 62154 平行经过时间= 107,9682892667 | 记忆(MB)= 27828 代码在GitHub中 ,非常简单。 该代码请求网页250次。 异步测试是: public async static Task AsynchronousTest() { List<Task> taskList = new List<Task>(); for (int i = 0; i < TOTAL_REQUEST; i++) { Task taskGetHtmlAsync = GetHtmlAsync(i); taskList.Add(taskGetHtmlAsync); } await Task.WhenAll(taskList); […]

又一个C#死锁调试问题

我使用VS2010 Professional在C#中构建了一个multithreading应用程序。 这是一个相当大的应用程序,我们之前已经经历过分类GUI交叉线程和死锁问题,但在过去的一个月里,我们注意到当它闲置大约20-30分钟时似乎锁定了。 该应用程序是无响应的,虽然当其他窗口被拖到应用程序前面并在其上面时它会重新绘制,但GUI似乎仍然被锁定… …(如果GUI线程被使用了相当长的时间) )关闭,最大化和最小化按钮也是无响应的,当点击时,应用程序的标题中不显示小(无响应…)文本,即Windows仍然认为它运行正常。 如果我使用调试器中断/暂停应用程序,并查看正在运行的线程。 我们的托管代码有3个线程正在运行,还有一些其他工作线程无法显示源代码。 运行的3个线程是: 主/ GUI线程 一个无限循环的线程 一个无限循环的线程 如果我进入线程2和3,它们似乎正在循环。 它们不共享锁(即使使用主GUI线程),它们根本不使用GUI线程。 然而,当进入主/ GUI线程时,它在Application.Run上被破坏了…… 这个问题让我感到僵局,但我不明白的是,如果它是死锁,为什么我看不到主/ GUI线程挂起的代码行? 任何帮助将不胜感激! 如果您需要更多信息,请与我们联系… 干杯, 袋鼠 ————————————————– – -解 – – – – – – – – – – – – – – – – – – – – – – – —- 好的,所以问题现在解决了。 感谢大家的建议! 非常感激! 我已经标记了解决我最初确定应用程序挂起的主/ UI线程的问题的答案(我没有关闭“启用我的代码”选项)。 […]

将属性作为参数传递

我想为LoadFromXML加载和validation创建一个通用的辅助方法。 如果我加载的XML不完整,我确实希望它在没有抛出exception的情况下完全失败。 目前,我的代码看起来像这样(或多或少) public override bool Load(XElement source) { return new List<Func> { i => this.LoadHelper(i.Element(User.XML_Username), ref this._username, User.Failure_Username), i => this.LoadHelper(i.Element(User.XML_Password), ref this._password, User.Failure_Password) //there are many more invokations of LoadHelper to justify this architecture } .AsParallel() .All(i => i.Invoke(source)); } private bool LoadHelper(XElement k, ref string index, string failure) { if (k != […]

在Parallel.For内部调用的方法中,HttpContext为null

尝试了很多后发布这个问题。 做正常不是一种选择,因为我们需要在很短的时间内完成大量的处理。 我有GetDataFor() ,其中使用了HttpContext.Current 。 代码如下所示: public void SomeMethod() { var context = HttpContext.Current; Parallel.For(0, 100, i => { var data = GetDataFor(i, context); }); } public data GetDataFor(int i, HttpContext context) { Uri requestUri = null; if (HttpContext.Current != null) { requestUri = HttpContext.Current.Request.Url; sCookie = string.Format(“{0}”, HttpContext.Current.Request.Headers[“cookie”]); } else { requestUri = context.Request.Url; […]

关于MemoryStream编写的OutOfMemoryException

我有一个小样本应用程序我正在努力尝试获得一些新的.Net 4.0 Parallel Extensions(它们非常好)。 我遇到了OutOfMemoryException的(可能真的很愚蠢)问题。 我想要将这个样本插入读取一些数据和大量文件的主要应用程序,对它们进行一些处理,然后将它们写出来。 我遇到了一些问题,文件变得越来越大(可能是GB),并担心内存,所以我想并行化导致我走这条道路的事情。 现在下面的代码在较小的文件上得到了OOME,我想我只是遗漏了一些东西。 它将读入10-15个文件并很好地将它们写在parellel中,但随后它会在下一个文件中窒息。 看起来它的读写速度约为650MB。 第二组眼睛将不胜感激。 我正在从FileStream读取MemorySteam,因为这是主应用程序所需要的,我只是想在某种程度上复制它。 它从所有类型的地方读取数据和文件,并作为MemoryStreams处理它们。 这是使用.Net 4.0 Beta 2,VS 2010。 namespace ParellelJob { class Program { BlockingCollection serviceToSolutionShare; static void Main(string[] args) { Program p = new Program(); p.serviceToSolutionShare = new BlockingCollection(); ServiceStage svc = new ServiceStage(ref p.serviceToSolutionShare); SolutionStage sol = new SolutionStage(ref p.serviceToSolutionShare); var svcTask = […]

使C#ParallelEnumerable.OrderBy稳定排序

我正在使用OrderBy并行地按整数ID排序对象列表。 我有一些具有相同id的对象,需要排序才能保持稳定。 根据微软的文档 ,并行化的OrderBy并不稳定,但有一种实现方法可以使其稳定。 但是,我找不到这样的例子。 var list = new List() { new pair(“a”, 1), new pair(“b”, 1), new pair(“c”, 2), new pair(“d”, 3), new pair(“e”, 4) }; var newList = list.AsParallel().WithDegreeOfParallelism(4).OrderBy(p => p.order); private class pair { private String name; public int order; public pair (String name, int order) { this.name = name; this.order = […]

C#中的并行处理/并行编程

我需要处理多个函数,并执行返回相同类型记录的结果。 考虑到我的function,我在visual studio 2010下使用c#: class Search{ public list GetrecordsofAAA(string term); public list GetrecordsofBBB(string term); public list GetrecordsofCCC(string term); } 我用这种方式调用函数 list records1 = Search.GetrecordsofAAA(heart); list records2 = Search.GetrecordsofBBB(heart); list records3 = Search.GetrecordsofCCC(heart); 这是系列处理。 如果可能的话,我需要同时填写记录1,记录2和记录3。

使用Parallel.ForEach()时防止远程系统过载

我们已经构建了这个需要在远程机器(实际上是MatLab服务器)上完成一些计算的应用程序。 我们使用Web服务连接到MatLab服务器并执行计算。 为了加快速度,我们使用了Parallel.ForEach() ,以便同时进行多个服务调用。 如果我们将ParallelOptions.MaxDegreeOfParallelism (DOP)设置为4或者其他东西非常保守,那么一切都运行良好。 但是,如果我们让框架决定DOP,它将产生如此多的线程,迫使远程机器跪下并开始超时(> 10分钟)。 我们如何解决这个问题? 我能够做的就是使用响应时间来限制呼叫。 如果响应时间小于30秒,请继续添加线程,一旦超过30秒,请使用更少的线程。 有什么建议? NB与此问题中的响应相关: https : //stackoverflow.com/a/20192692/896697

书籍推荐 – C#.NET 4.0的并行编程

我正在寻找一本包含以下主题信息的书: 线程同步方法 并行扩展 Asynchronouse编程(Invoke,BeginInvoke,BackgroundWorker,Threads,…) 我已经对这些主题有所了解,但我将深入研究所有这些主题并专注于C#。 本书的建议应该是针对C#/ .NET 4.0(不是Java)以及英语或德语。 感谢你们。 丹尼