我有一个Windows服务,可以从多个MessageQueue实例中读取.这些消息类都可以运行自己的Task用于读取消息.通常,阅读消息后,完成了I/O数据库的工作.我发现文章声称在I/O操作上使用异步是一个好主意,因为它可以释放线程.我正在尝试模拟在控制台应用程序中使用异步I/O功能的性能提升. 控制台应用程序 在我的测试环境中,我有10个队列. GetQueues()返回10个不同的MessageQueue实例. static void Main(string[] args) { var isAsync = Console.ReadLine() == "Y"; foreach (var queue in queueManager.GetQueues()) { var temp = queue; Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
以下是关于 task-parallel-library 的编程技术问答
我正在进行一些实验,对它们进行定时并比较时间以找到最佳的"算法".提出的问题是,如果并行运行任务是否会使实验的相对运行时间错误,并且是否会通过依次运行它们来获得更多代表性的结果.这是代码的(简化)版本: public static void RunExperient(IEnumerable experiments) { Parallel.ForEach(experiments, experiment => { var sw = Stopwatch.StartNew(); //line 1 experiment(); //line 2 sw.Stop(); //line 3 Console.WriteLine(@"Time was {0}", sw.Ela
(坚持以许多网页的异步提取的常见示例) 我如何异步散发多个(数百个)网页请求,然后等待所有请求完成之前完成下一步?异步套管一次处理几个请求,由CPU上的核心数控制.抓住网页不是CPU的操作.对异步的加速不满意. 我试图将async.startastask和task []的点之间的点连接起来.本能地,我编写了以下代码,但没有编译. let processItemsConcurrently (items : int seq) = let tasks = items |> Seq.map (fun item -> Async.StartAsTask(fetchAsync item)) Tasks.Task.WaitAll(tasks) 您将如何处理? 解决方案 Async.Parallel几乎绝对是在这里.不确定您不满意的; f#asyncs的强度在于异步计算中,而不是任务并行cpu结合的东西(更量身定制为Task s和.net 4.0 TPL).这是一个
问题1. 使用并行使用并行.专门适合处理被订购或无序的任务? 我询问的原因是,我最近更新了一个串行循环,其中使用了StringBuilder来基于各种参数来生成SQL语句.结果是,与使用标准foreach循环相比,SQL有点混乱(到包含语法错误的点),因此我的直觉是,TPL不适合执行必须在必须出现数据的任务特定顺序. 问题2. TPL是否会在执行前必须使用必须提供任何内容的多项架构? 我提出此问题的原因与我提出的有关TPL操作的性能分析的耳部问题有关.一个问题的答案使我对TPL的效率并不比标准串行循环更有效,因为该应用程序可能无法访问多个核心,因此,创建其他线程和循环的开销与比较相比会降低性能到标准串行循环. 解决方案 我的直觉是TPL不适合执行必须按特定顺序显示数据的任务. 正确.如果您期望一切顺序,那么当您"并行"一个循环时会发生什么. TPL是否会在执行前必须使用必须提供任何内容的多项架构? 请参阅MSDN杂志上的以下文章:
我有一些代码,我目前正在优化多项架构中的并发性.在我的一个课程中,我找到了一个嵌套的foreach循环.基本上,外循环通过NetworkInterface对象的数组迭代.内部循环通过网络接口IP地址迭代. 它让我想到,嵌套Parallel.ForEach循环一定是一个好主意吗?阅读本文后( nested Parallel.在同一列表上添加循环吗?)我仍然不确定在效率和并行设计方面适用的地方.此示例将大约应用于两个循环在该列表上执行操作的列表. 在我的示例中,循环正在做不同的事情,所以我应该: 使用嵌套Parallel.ForEach循环? 在父循环上使用Parallel.ForEach,然后将内部循环as-is? 解决方案 平行.foreach不一定是并行执行的 - 如果可能的话,这只是一个请求.因此,如果执行环境没有并行执行循环的CPU幂,则不会这样做. 如果循环中的动作无关(即,如果它们是分开的,并且不影响彼此),我认为使用并行的情况下没有问题.
我有一个WPF项目,在该项目中,我正在使用绑定到文本框的属性上的InotifyPropertychanged.我正在使用任务(taskParallelibrary)在其他线程上更新此值.它已正确更新,没有异常.我当时认为它会引发例外,因为它在背景线程上而不是UI线程上运行.当然,如果我直接使用UI元素,它将引发异常.那么,InotifyPropertychanged绑定机制是否会自动调入UI线程? 这是我带有属性的代码. private string _textProperty = ""; public string TextProperty { get { return _textProperty; } set { if (_textProperty != value) { _
我的问题很多.自从我看到.净4.5,我印象深刻.不幸的是,我所有的项目都是.NET 4.0,我没有考虑迁移.因此,我想简化我的代码. 目前,我的大多数代码通常需要足够的时间冻结屏幕,我会执行以下操作: BackgroundWorker bd = new BackgroundWorker(); bd.DoWork += (a, r) => { r.Result = ProcessMethod(r.Argument); }; bd.RunWorkerCompleted += (a, r) => { UpdateView(r.Result); }; bd.RunWorkerAsync(args); 老实说,我对此感到厌倦.当存在逻辑复杂的用户交互时,这将成为一个大问题. 我想知道,如何简化这种逻辑? (请记住,我与之在一起.Net4.0)我注意到Google的一些内容,但没有发现任何易于实现的东西,适合我
动机 c#5.0异步/等待结构很棒,不幸的是,微软仅显示了.NET 4.5和VS 2012的释放候选者,这将需要一些时间,直到我们的项目中这些技术将被广泛采用. 在Stephen Toub的 asynchronous方法任务我发现了一个可以在.NET 4.0中很好地使用的替代品.即使在.NET 2.0中,也可以使用该方法,尽管它们似乎很少过时,而且功能较少. 也可以使用该方法. 示例 所以现在我的.NET 4.0代码看起来像(评论的部分显示了在.NET 4.5中如何完成的. //private async Task ProcessMessageAsync() private IEnumerable ProcessMessageAsync() { //var udpReceiveResult = await udpClient.ReceiveAsync(); var task = Task
我想创建一些需要一些非常密集的CPU计算的文档.这些文档是异质的,有些是PDF,有些是Excel,有些是Word Documents.我的输入是三个ID序列,例如: // Input int[] pdfIDs = new[] { 1, 2, 3 }; int[] xlsIDs = new[] { 11, 12, 13, 14 }; int[] docIDs = new[] { 21, 22 }; 我已经有了创建这些文档类型的方法.这是这些方法的简化版本: PdfFile CreatePdfFile(int id) { Thread.Sleep(1000); // Simulate some heavy calculation return new PdfFile(); } XlsFile CreateXlsFile(int id) { Thread.Sleep(1500); // Simulate some heavy calculation
我有一个网站,我写了一个httpmodule来转换所有链接,所以所有事情都可以,直到我要在转换URL中使用并行性. 这是我的测试控制台应用程序: class Program { static void Main(string[] args) { new Job().Do(); } } public class Job { public void Do() { string content = @" new link1 href=""www.yahoo1.com"" end new link2 href=""www.yahoo2.com"" end new link3 href=""www.yahoo3.com"" end
我正在使用fortran的metis 5.我正在使用PartGraphRecursive函数与手册中给出的简单示例.给出代码不是工作条件. program main implicit none integer,parameter::nvtxs=15, Edges=22 integer::xadj(nvtxs+1),adjncy(2*Edges) integer::objval, part(nvtxs) xadj=[0, 2, 5, 8, 11, 13, 16, 20, 24, 28, 31, 33, 36, 39, 42, 44] adjncy=[1, 5, 0, 2, 6, 1, 3, 7, 2, 4, 8, 3, 9, 0, 6, 10, 1, 5, 7, 11, 2, 6, 8, 12, 3, 7, 9, 13, 4, 8, 14, 5, 11, 6, 10, 12, 7, 11, 13, 8, 12, 14, 9, 13] call
我创建了一个 Console App ,它使用C# Task.Run()方法将数字打印为for loop.如果您查看代码,我将在循环中初始化Employee object并在方法中传递数字,尽管它打印了相同的数字. 代码: class Program { static void Main(string[] args) { for (int i = 1; i new Employee().ProcessEmployee(i)); } Console.Read(); } } public class Employee { public void ProcessEmployee(int employe
我正计划在某个时候在我的项目中使用RX,并且我一直在研究我可以使用RX的工作. 我的项目使用TPL并行处理状态机转换(利用所有可用处理器内核).但是,为了提高性能,我想用Rx推动机制替换当前的Ilist 拉动机制. 由于我对这项技术的了解不多,因此我想确定RX是否与将令牌推向平行状态过渡.我将要求所有并行状态过渡订阅RX主题并检索下一步的标记.每个状态过渡都需要该主题的同样令牌.从我自己的研究中了解到的是,一旦一个令牌被赶到了观察者(在这种情况下是国家过渡),即使令牌永远消失了.如果是这种情况,其他过渡(对于同一状态)将永远不会收到这个令牌,最终将处于错误状态. 有人可以启发我我的担忧是否正确吗?我只是在探索我的选择时没有代码. 谢谢. 解决方案 可能有助于将RX主题视为类似于.NET事件的RX主题,即注册事件处理程序的线程安全列表.在主题的情况下,这些可能被认为等于单个观察者Onnext代表.事件启动后,每个处理程序都会使用相同的事件参数调用.同样,每个
一旦我将任务分为4个独立任务并使它们并行运行. 是否可以并行进一步运行每个任务? (说,每个任务,每个循环都有很多 - 可以作为并行代码实现) 解决方案 您肯定可以,但是它不保证线程安全. 您必须考虑多个因素 您的迭代尺寸是多少(越多越好) 您的CPU可以处理多少个并发线程 您的处理器中的内核量 Parallel.For(0, length1, i => { Parallel.For(0, length2, j => { Console.WriteLine(i * j); }); }); 其他解决方案 也许您应该重新考虑算法并仅保留一个Parallel.for().原因在此链接中描述: http://www.albahari.com/threading.com/threading/part5.aspx5.aspx5.aspx 在"外部与内部环"段落中: "并行.通常是不必要的.在以
i具有 线的函数 private void DoSomethingToFeed(IFeed feed) { feed.SendData(); // Send data to remote server Thread.Sleep(1000 * 60 * 5); // Sleep 5 minutes feed.GetResults(); // Get data from remote server after it's processed it } 我想平行于此,因为我有很多彼此独立的提要.基于这个答案,将Thread.Sleep()留在其中没有一个好主意.我还想等所有线程旋转之后,直到他们都有机会获得结果为止. 处理这样的方案的最佳方法是什么? 编辑,因为我不小心遗漏了它:我最初考虑将此功能称为Parallel.ForEach(feeds, DoSomethingToFeed),但是我想知道当我找到答案时是否有更好的
我尝试在C#中实现深度搜索,但我不确定如何以分布式计算方式执行此操作.如果你们可以在这方面帮助我,我真的很感激:)您可以在下面找到我的DFS代码 public class DFS { static List traversedList = new List(); static List parentList = new List(); public static void Main(string[] args) { int N = 100; int M = N * 4; int P = N * 16; Stack newstack = new Stack(); List global_list=new List(); StreamReader file = new StreamReader("my input file");
我具有以下工作流程,需要以非阻滞并行处理方式进行.我希望方法DoStuff()立即返回,因此我正在使用任务并行性libary DoStuff(): Do some setup Parse an Excel file then for each row Fill Template with parsed values Convert filled template to Pdf Convert pdf to Tiff when all row processing has completed Create Summary Text File when summary text file has completed, Finalize 我想立即返回,因为"所有行处理都已完成"步骤有点绊倒.以下是我应该做的吗? public Task DoStuff() { return new Task