Tag: multithreading

从工作线程更新表单控件的最佳方法是什么?

我做了一些研究,我真的找不到从C#中的工作线程更新表单控件的首选方法。 我知道BackgroundWorker组件,但是在不使用BackgroundWorker组件的情况下,最好的方法是什么?

在用于暂停线程时,循环Thread.Sleep()会不会对性能造成影响?

有(或者已经有)很多关于使用Thread.Sleep()方法的好坏的讨论。 据我所知,它主要用于调试目的。 现在我想知道:用于我的特定目的是不是很糟糕,也就是说,不断循环它以便能够暂停/恢复线程? 我这样做是因为我想暂停一个执行I / O操作的线程,并能够以一种简单的方式恢复它。 I / O操作基本上只是将4096字节的块写入文件,直到所有数据都写入其中。 由于文件可能很大并且需要很长时间,我希望能够暂停操作(以防它开始吃掉很多系统资源)。 我的代码,VB.NET版本: ‘Class level. Private BytesWritten As Long = 0 Private Pause As Boolean = False ‘Method (thread) level. While BytesWritten < [target file size] …write 4096 byte buffer to file… While Pause = True Thread.Sleep(250) End While …do some more stuff… End While C#等价物: //Class […]

在.NET中重新启动线程(使用C#)

我正在寻找一种方法来重新启动已被Abort()停止的线程。 public partial class MyProgram : Form { private Thread MyThread = new Thread(MyFunction); private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button(); public MyProgram() { MyThread.Start(); startStopBtn += new EventHandler(doStop); startStopBtn.Text = “Stop”; } private static void MyFunction() { // do something } private void doStop(object sender, EventArgs e) { MyThread.Abort(); startStopBtn -= new EventHandler(doStop); startStopBtn += […]

字典查找需要锁定吗?

lock(dictionaryX) { dictionaryX.TryGetValue(key, out value); } 在查找字典时是否需要锁定? 程序是multithreading的,并且在向dict添加键/值时。 dict被锁定了。

如何在C#中创建系统互斥锁?

如何创建系统/多进程Mutex以使用相同的非托管资源协调多个进程。 背景:我编写了一个使用文件打印机的程序,它一次只能由一个进程使用。 如果我想在计算机上运行的多个程序上使用它,我需要一种在整个系统中同步它的方法。

为什么锁定公共对象是一个坏主意

好吧,我已经使用了很多锁,但我以前从未有过这种情况。 我有两个不同的类,包含用于修改相同的MSAccess数据库的代码: public class DatabaseNinja { public void UseSQLKatana { //Code to execute queries against db.TableAwesome } } public class DatabasePirate { public void UseSQLCutlass { //Code to execute queries against db.TableAwesome } } 这是一个问题,因为数据库的事务不能并行执行,并且这些方法(UseSQLKatana和UseSQLCutlass)由不同的线程调用。 在我的研究中,我发现使用公共对象作为锁定对象是不好的做法,那么如何锁定这些方法以使它们不会串联运行? 答案只是让这些方法在同一个类中? (在我的实际代码中,这实际上并不那么简单)

Threadsafe foreach枚举列表

我需要枚举通用的IList 对象。 列表的内容可能会更改,如在其他线程中添加或删除,这将使用“已修改集合;枚举操作可能无法执行”来终止我的枚举。 在IList 上执行线程安全foreach的好方法是什么? 可以预先没有克隆整个列表。 无法克隆列表引用的实际对象。

lock()语句会阻塞进程/ appdomain中的所有线程吗?

也许问题听起来很愚蠢,但我不明白’关于线程和锁定的东西,我想得到一个确认( 这就是我问的原因 )。 所以,如果我有10个服务器,同时有10个请求来到每个服务器,那就是整个服务器场的100个请求。 没有锁定,那就是100请求数据库。 如果我做这样的事情: private static readonly object myLockHolder = new object(); if (Cache[key] == null) { lock(myLockHolder) { if (Cache[key] == null) { Cache[key] = LengthyDatabaseCall(); } } } 我会做多少个数据库请求? 10? 100? 或者我有线程?

并行循环调用中的进度条

我试图在multithreading环境中更新进度条。 我知道很多问题已经解决了这个问题,但提议的解决方案都没有对我有用。 这是我的代码的主干: public static void DO_Computation(//parameters) { //Intialisation of parameters Parallel.For(struct initialisation with local data) { //business logic //Call to update_progressbar (located in an another class, as the DO_Computation function is in Computation.cs class (not deriving from Form). WinForm.Invoke((Action)delegate {Update_Progress_Bar(i);}); //WinForm is a class that exposes the progressbar. } } 这不起作用(进度条在达到100%时冻结,这是正常的(我们可以参考这个问题的微软文章 (事实上​​,这不是一个线程安全的操作方法)。)Microsoft网站stiraptes to wrap […]

将.Net Garbage收集一个未被引用的对象,但是有一个正在运行的线程吗?

我有以下代码(为了便于阅读而减少): 主类: public StartProcess() { Thinker th = new Thinker(); th.DoneThinking += new Thinker.ProcessingFinished(ThinkerFinished); th.StartThinking(); } void ThinkerFinished() { Console.WriteLine(“Thinker finished”); } 思想家class级: public class Thinker { private System.Timers.Timer t; public delegate void ProcessingFinished(); public event ProcessingFinished DoneThinking; BackgroundWorker backgroundThread; public Thinker() { } public StartThinking() { t = new System.Timers.Timer(5000); // 5 second timer […]