Tag: multithreading

使用单例multithreadingC#制作程序

我用C#编写了一个程序。 现在我完成了所有function,它的工作原理。 但只能用一个线程运行。 我正在进行大量计算,有时会将大约300 MB或更多的测量文件加载到应用程序中。 我现在想要使程序multithreading,因为在强烈处理或i / o操作时用户体验非常糟糕。 重构程序的最佳方法是什么,以便可以在没有太多附加的情况下制作multithreading? 我知道这是我之前想要的东西。 但我没有。 我使用单例模式来处理大约3个重要的模块,这些模块几乎涉及程序的所有其他function。 我使用了或多或少干净的MVC(模型视图控制)架构。 所以我想知道是否有可能让用户界面在一个线程中运行而另一个应用程序在另一个线程中运行。 如果没有,加载和解析300MB,创建对象大约需要3分钟才能完成。 在这个时候,用户没有得到GUI的响应。 :/ 更新:我的单身人士被用作一种存储。 一个单例保存解析的测量文件的对象,而另一个单例保存结果。 我有不同的计算,它使用相同的测量文件并创建他们想要使用其他单例保存的结果。 这是一个问题。 第二个是让人员对用户操作做出响应,或者至少避免窗口没有响应的警告。 谢谢大家的所有建议。 我会试试看。 对不起,我很抱歉。

多核处理器上的多个线程

如何在multithreading系统中的CORES之间分配线程。 假设我有一个创建6个线程的程序。 我的系统有3个CORES。 在这种情况下,线程是在3个CORE之间分配还是所有线程都在同一个CORE上执行?

OutOfMemoryException,堆栈大小很大,线程数量很大

我正在分析我的.net Windows服务。 我试图发现OutOfMemoryException并发现我的堆栈大小很大并且正在增长,因为线程数量不断增长。 每个线程在Windows x64计算机上获得1024 KB 。 因此,当我的应用程序有754个线程时,堆栈大小将为772 MB 。 对我来说问题是我不知道这些线程来自哪里。 最初我的应用程序的线程数量非常有限,并且随着时间的推移不断增长。 我有两个怀疑 – 这些线程是由WCF或数据库连接创建的。 我的应用程序使用WCF和数据集。 此外,我试图在Ants do Trace中配置我的应用程序,我可以看到大量的System.ServiceModel.Channels.ClientReliableDuplexSessionChannel ,这个数字随着时间的推移而增加。 我可以看到创建了数千个这样的对象。 所以我想知道的是谁创建线程(发现工具,分析器)以及创建这些线程的WCF是谁。 UPDATE 我已经在调试器中停止了我的应用程序来查看线程。 我只能看到大量带有调用堆栈的Win32线程 ntdll.dll!7c82860c() [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] ntdll.dll!7c827d99() kernel32.dll!77e4e02f() mscorwks.dll!79e7c7a8() mscorwks.dll!79f943fe() mscorwks.dll!79f94237() mscorlib.ni.dll!792f5577() mscorlib.ni.dll!792e01c5()

可以使用任务并行库一起运行长时间运行的方法和“工作…”对话框,以允许长任务写入BindingList吗?

我有一个WPF(C#和.NET 4)应用程序,其中有一个长时间运行的任务阻止了UI,给人的印象是它已挂起。 我决定使用BackgroundWorker线程将这个长时间运行的任务放到一个单独的线程中,并在一个单独的弹出窗口中显示一个BusyIndicator (下面名为WorkingDialog)。 这很好用,直到长时间运行的任务写入BindingList(绑定到UI上的网格),我得到以下exception: 这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection 这是(业务层代码的一个非常精简的版本)… public class CustomMessage { public DateTime TimeStamp { get; private set; } public string Message { get; private set; } public CustomMessage(string message) { Message = message; TimeStamp = DateTime.Now; } } public class MyRandomBusinessClass { public BindingList LoggingList { get; private set; } public MyRandomBusinessClass() { LoggingList […]

C#中的线程和GUI元素

我正在尝试创建一个基本的IRC客户端…但我的问题是让文本显示在RTF框中而不会滞后 我决定使用线程,我想更新一个线程中的RTF框,但我不能因为它给出了关于RTF框元素不是静态的错误? 任何见解? 如果你们想要,我会粘贴代码 好的,这里是代码(编辑凹凸?) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.IO; using System.Threading; using System.Net; namespace IrcClient { public partial class mainWindow : Form { static IRC client; static string newLine, oldLine; public mainWindow() { InitializeComponent(); } private void main() { […]

c#后台工人类

我想把这个方法放到后台工作者类中,我正在尝试但是卡住了,任何人都可以帮助我如何将这个方法运行到后台工作者类中: 我将此方法调用到我的asp.net页面,其中文件在服务器上压缩,然后返回到客户端。 但压缩文件可能需要更长时间,用户将看到一个忙碌的屏幕,所以为了避免我想使用后台工作者类: [Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.ReadWrite)] public string Zip(string f, bool original) { string zip = “”; try { files = HttpContext.Current.Server.UrlDecode(files); string[] fileCollection = files.Split(‘*’); zipFile = class1.zipfile(fileCollection, IsOriginal); int fileLength = files.Length; } catch (Exception ex) { Console.WriteLine(“Exception during processing {0}”, ex); } return File; }

使用.AsParallel()。ForAll或Parallel.ForEach性能问题并行化任务

我有一个网站列表和一个代理服务器列表。 我有这个动作 Action action = (string url) => { var proxy = ProxyHandler.GetProxy(); HtmlDocument html = null; while (html == null) { try { html = htmlDocumentLoader.LoadDocument(url, proxy.Address); // Various db manipulation code ProxyHandler.ReleaseProxy(proxy); } catch (Exception exc) { Console.WriteLine(“{0} proxies remain”, ProxyHandler.ListSize()); // Various db manipulation code proxy = ProxyHandler.GetProxy(); } } }; 我打电话给谁 […]

全局捕获在后台线程中从WCF异步调用抛出的exception

我有一个与WCF服务通信的WPF应用程序。 我正在使用以下基于async的模式从我的ViewModel调用我的WCF服务(我正在使用MVVM模式): public async override void MyCommandImplementation() { using (var proxy = new MyProxy()) { var something = await proxy.GetSomethingAsync(); this.MyProperty = something; } } 当我遵循MVVM模式时,我有我的ViewModel公开的ICommand公共属性,因此关联的命令实现不会返回Task对象,因为它们就像事件处理程序一样。 所以exception处理实际上非常简单,即我能够使用以下模式捕获从我的WCF服务抛出的任何exception: public async override void MyCommandImplementation() { try { using (var proxy = new MyProxy()) { var something = await proxy.GetSomethingAsync(); } } catch (FaultException ex) { // Do […]

MSDN上的SimplePriorityQueue示例中存在严重错误

我需要使用并发优先级队列,我正在考虑在MSDN上调整如何:添加边界和阻塞function中给出的SimplePriorityQueue示例到一个收集教程。 但是,我对这个样本似乎有的错误的严重性感到惊讶。 有人可以validation这些问题是否确实存在? 1) TryAdd和ToArray之间存在竞争危险,这可能导致从后者抛出ArgumentException 。 TryAdd方法首先将项添加到内部队列,然后递增m_count计数器。 另一方面, ToArray首先初始化一个大小为m_count的新数组,然后将内部队列复制到该数组中。 如果在执行ToArray调用ToArray ,则ToArray可能最终会尝试复制比在数组中分配空间更多的项目,从而导致CopyTo调用抛出ArgumentException 。 private ConcurrentQueue<KeyValuePair>[] _queues; private int m_count; // … // IProducerConsumerCollection members public bool TryAdd(KeyValuePair item) { _queues[item.Key].Enqueue(item); Interlocked.Increment(ref m_count); return true; } public int Count { get { return m_count; } } public KeyValuePair[] ToArray() { KeyValuePair[] result; lock (_queues) { result = […]

什么是在类中读/写C#属性的线程安全方法?

我是C#的新手。 在Java中,我可以通过在setter / getter方法中使用’synchronized’关键字来读/写Java类成员。 你能告诉我在C#中做同样的事情的正确方法吗? 在C#中没有synchronized关键字。 我应该使用在java的synchronized关键字的C#版本中提到的'[MethodImpl(MethodImplOptions.Synchronized)]注释吗? ? 或者使用Monitor.Enter(以及随后的Monitor.Exit)?