Tag: 并行扩展

WCF并行模拟

我有一个带有“ImpersonationOption.Required”的WCF服务。 使用并行性时,模拟似乎没有流过。 例如: Parallel.ForEach(items => results.Add(SystemUtil.WindowsUser.Name) 将使用模拟用户返回一个数字,并使用app pool用户返回一个数字。 是否可以假冒并行工作? 最好, 渣 更新: 这是IIS服务端的实际代码。 [OperationBehavior(Impersonation = ImpersonationOption.Required)] public string[] WhoAmI(int numOfTests) { var tests = new List(); for (var i = 0; i < numOfTests; i++) tests.Add(i); var results = new ConcurrentBag(); Parallel.ForEach(tests, (test) => results.Add(WindowsIdentity.GetCurrent(false).Name)); return results.ToArray(); } 如果我传入numOfTests = 10,它会生成10个任务并返回每个任务的WindowsIndentity名称。 我得到的是~70%“IIS APPPOOL.NET v4.0”和~30%我。 如何设置它以使我的身份始终进入Parallel.ForEach? […]

并行扩展

我有一个具有大量IO操作的应用程序,例如文件复制,压缩和移动文件系统周围的文件,复制到备份服务器。 我将此程序构建为单线程。 它运行2分钟。 我使用Parallel扩展并使用Task构建了该程序的另一个版本,它几乎在2分钟内运行。 换句话说,由于IO很大,我没有看到使用Parallels带来的性能提升。 如果我将应用程序部署到刀片服务器,我会得到相同的结果吗? 刀片服务器是否比我的工作站更快/更多地处理IO? 将Parallels与IO绑定应用程序一起使用没有任何好处吗?

Parallel.ForEach没有启动新线程

Parallel.ForEach没有旋转新线程 大家好,我们有一个非常密集的IO操作,我们使用Microsoft的.NET Framework并行扩展中的Parallel.ForEach编写。 我们需要删除大量文件,并且我们将要删除的文件表示为列表列表。 每个嵌套列表中都有1000条消息,我们有50条这样的列表。 这里的问题是,当我查看后面的日志时,我只看到在Parallel.ForEach块内执行一个线程。 这是代码的样子: List<List> expiredMessagesLists = GetNestedListOfMessages(); foreach (List subList in expiredMessagesLists) { Parallel.ForEach(subList, msg => { try { Logger.LogEvent(TraceEventType.Information, “Purging Message {0} on Thread {1}”, msg.MessageID, msg.ExtensionID, Thread.CurrentThread.Name); DeleteMessageFiles(msg); } catch (Exception ex) { Logger.LogException(TraceEventType.Error, ex); } }); } 我用一个更简单的数据结构编写了一些示例代码,没有IO逻辑,我可以在Parallel.ForEach块中看到几个不同的线程。 我们在上面的代码中使用Parallel.ForEach做错了吗? 它可能是绊倒它的列表列表,还是IO操作存在某种线程限制?

Parallel.ForEach不断产生新线程

当我在我的程序中使用Parallel.ForEach时,我发现有些线程似乎永远不会完成。 实际上,它一直在反复产生新的线程,这种行为是我没想到的,绝对不想要的。 我能够使用以下代码重现此行为,就像我的“真实”程序一样,它们都使用处理器和内存(.NET 4.0代码): public class Node { public Node Previous { get; private set; } public Node(Node previous) { Previous = previous; } } public class Program { public static void Main(string[] args) { DateTime startMoment = DateTime.Now; int concurrentThreads = 0; var jobs = Enumerable.Range(0, 2000); Parallel.ForEach(jobs, delegate(int jobNr) { Interlocked.Increment(ref concurrentThreads); int […]