Tag: multithreading

以线程安全的方式添加到Parallel.ForEach循环中的列表

我在一个名为ListofObjects的obj对象列表中有一些像这样工作的代码: List NewListofObjects(); Parallel.ForEach(ListofObjects, obj => //Do some operations here on obj to get a newobj NewListofObjects.Add(newobj); ); 现在我不在Parallel.ForEach循环中,我想对NewListofObjects进行操作。 但是,当我尝试: “尝试读取或写入受保护的内存时,我收到此错误。这通常表示其他内存已损坏”。 这是因为我的NewListofObjects.Add(newobj)方法不是线程安全的吗? 如果是这样,我怎么能让它线程安全?

新的Thread(void Target())和新的Thread(新的ThreadStart(void Target())之间有什么区别?)

很抱歉,如果之前已经询问过这个问题,但我想简单回答以下两种用法之间的差异。 VS似乎接受它们作为有效代码。 private static void doSomeWork() { //do some work } public someClass() { //Thread thread = new Thread(doSomeWork); //or //Thread thread = new Thread(new ThreadStart(doSomeWork)); }

TPL完成与完成

我需要从遗留数据库导入客户相关数据,并在此过程中执行多次转换。 这意味着单个条目需要执行其他“事件”(同步产品,创建发​​票等)。 我最初的解决方案是简单的并行方法。 它工作正常,但有时它有问题。 如果当前处理的客户需要等待相同类型的事件,他们的处理队列可能会卡住并最终超时,导致每个基础事件也失败(它们依赖于失败的事件)。 它不会一直发生,但它很烦人。 所以我有了另一个想法,分批工作。 我的意思不仅是限制同时处理的客户数量,还包括广播到队列的事件数量。 在寻找想法时,我找到了这个答案,它指向了TPL DataFlow 。 我制作了一个骨架来熟悉它。 我建立了一个简单的管道,但我对Complete()的使用和等待Completion()有点困惑。 步骤如下 制作一个数字列表(要导入的客户的ID) – 这是在导入逻辑之外,它只是在那里能够触发其余的逻辑 创建BatchBlock (以便能够同时限制要处理的客户数量) 基于id创建单个MyClass1项( TransformBlock ) 执行一些逻辑并生成MyClass2的集合( TransformManyBlock ) – 例如,睡眠1秒 对集合的每个项目执行一些逻辑( ActionBlock ) – 例如,hibernate1秒钟 这是完整的代码: public static class Program { private static void Main(string[] args) { var batchBlock = new BatchBlock(2); for (var i = 1; i […]

执行SQL查询时显示进度条

我想在从SQL数据库中读取数据时通知用户,我决定创建一个带有进度条的表单,但它不起作用 – 可能是因为需要一个线程。 我想以编程方式创建表单 ProgressBar pb = new ProgressBar(); pb.MarqueeAnimationSpeed = 30; pb.Style = ProgressBarStyle.Marquee; pb.Dock = DockStyle.Fill; progressForm.ClientSize = new Size(200, 50); progressForm.FormBorderStyle = FormBorderStyle.FixedDialog; progressForm.StartPosition = FormStartPosition.CenterScreen; progressForm.Controls.Add(pb); progressForm.ControlBox = false; progressForm.TopMost = true; progressForm.Show(); //do data processes here (all queries and executes) progressForm.close(); 如何修改上面的代码以实现我的既定目标? 编辑:顺便说一下,我想在项目的每个数据函数中使用这个进度条表单。 例如:fillGrid,runQuery .. @Will非常感谢你的回答。 我的意思是我如何使用类的函数,例如我的gridFill函数在该连接类中: class ConnectionClass { […]

C#线程不释放内存

我有一个用C#.Net编写的Windows服务。 当服务启动时,我生成一个新线程,如下所示 new Thread(new ThreadStart(Function1)).Start(); 这个线程无限循环并执行我的服务所期望的职责。 每天一次,我需要同时执行一个不同的操作,我的线程会生成第二个线程,如下所示 new Thread(new ThreadStart(Function2)).Start(); 第二个线程执行一个非常简单的function。 它使用FileReadAllLines读取文本文件的所有行,快速处理此信息并退出。 我的问题是没有收集读取文件的第二个线程使用的内存。 我让我的服务运行了3个小时,希望调用GC但没有任何反应,任务管理器仍然显示我的服务正在使用150mb的内存。 读取和处理文本文件的函数非常简单,我确信没有对包含文本的字符串数组的隐藏引用。 有人可以解释为什么会这样吗? 是否有可能由另一个衍生线程生成的线程无法自行清理? 谢谢

当我不使用TaskCreationOptions.LongRunning时出现奇怪的行为

我有一个具有任意数量轮询器的引擎,每个轮询器每隔几秒就进行一次“轮询”。 我希望轮询器在不同的线程中运行,但是单个轮询器中的每个“轮询”应该是顺序的,以便在下一个轮询器之后发生。 一切正在使用此代码启动轮询过程: public void StartPolling() { Stopwatch watch = new Stopwatch(); while (Engine.IsRunning) { Task task = Task.Factory.StartNew(() =>{ watch.Restart(); Poll(); watch.Stop(); },TaskCreationOptions.LongRunning); task.Wait(); if(Frequency > watch.Elapsed) Thread.Sleep(Frequency – watch.Elapsed); } } 然而,我花了一段时间才发现TaskCreationOptions.LongRunning选项,它解决了我遇到的一个奇怪的问题,我仍然不明白。 没有这个选项,如果我运行一个创建1-3个这些轮询器的测试,一切正常。 如果我创造了4+,那么我遇到了奇怪的行为。 其中三个轮询器可以工作,一个只执行一个轮询,剩下的任何轮询都不会轮询。 总的来说,我的任务是长期运行的。 毕竟他们正在运行我的整个程序。 但我不明白为什么没有这个选项设置我会得到一些不好的行为。 任何帮助,将不胜感激。

C#中’volatile’关键字的目的是什么?

在C#中volatile关键字的目的是什么? 我需要在哪里使用此关键字? 我看到了以下声明,但我无法理解为什么需要使用volatile ? internal volatile string UserName;

在线程应用程序中准确定位一行代码,C#

假设应用程序是multithreading的,在C#中对线程或代码行进行计时的最准确方法是什么? 亲切的问候,

C#Windows应用程序 – 许multithreading使用相同的连接?

我有一个multithreading的ac#WINDOWS应用程序。 我的理解是,在Web环境中,连接会自动汇集。 我的理解是,在Windows应用程序中,情况并非如此。 因此,对于Windows应用程序,应使用相同的连接,而不是在每次调用后关闭,而是在应用程序关闭时关闭。 我很好奇 – 我是对的吗? 如果是,两个线程是否可以使用相同的连接同时从数据库获取数据集,或者该function是否排队? 谢谢

什么线程在silverlight WCF调用上调用已完成的事件处理程序?

假设我有Silverlight应用程序调用WCF服务: void DoStuff() { MyProxy proxy = new MyProxy(); proxy.DoStuffCompleted += DoStuffCompleted; proxy.DoStuffAsync(); } void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e) { // Handle the result. } UI线程调用DoStuff 。 什么线程最终会调用DoStuffCompleted方法? 如果我同时调用两个异步调用,是否有可能在不同的线程上同时触发两个已完成的事件?