草庐IT

多线程、Handler机制、ThreadLocal

全部标签

C# 单例线程安全

我有一个类似这样的单例类publicclassSingleton{privatestaticSingletonm_instance;privateTimerm_timer;privatestaticListm_cacheObjects;privateSingleton(){m_cacheObjects=newList();m_timer=newTimer(MyTimerCallBack,null,TimeSpan.FromSeconds(60),TimeSpan.FromSeconds(60));}publicstaticSingletonInstance{get{if(m_insta

c# - .NET 的多线程库

我在一些程序中使用了多线程,但仍然感觉不太舒服。有哪些适用于C#/.NET的多线程库,它们之间有哪些优势?我所说的多线程库是指所有有助于简化多线程编程的东西。您定期使用什么.NET集成(即像ThreadPool)?你遇到了哪些问题? 最佳答案 在应用程序中使用多线程有多种原因:界面响应能力并发操作并行加速应该选择哪种方法取决于您要执行的操作。例如,对于UI响应,请考虑使用BackgroundWorker。对于并发操作(例如,服务器:某些东西必须是并行的,但即使在单核系统上也可能确实需要并发),考虑使用线程池或,如果任务是长期存在的并

c# - 即使在方法完成后线程如何访问局部变量?

假设我有一个这样的C#方法publicvoidMyMethod(){inti=0;varthread=newThread(()=>{Thread.Sleep(100);if(i==0){Console.WriteLine("Valuenotchangedandis{0}",i);}else{Console.WriteLine("Valuechangedto{0}.",i);}});thread.Start();i=1;}这里的方法创建了一个线程,该线程访问在方法中创建的局部变量。当它访问这个变量时,方法已经完成,因此局部变量i不应该存在。但是代码运行没有任何问题。根据我的理解,局部变量

c# - 停止正在运行的线程的安全方法是什么?

我有一个包含IronPython脚本执行的线程。出于某种原因,我可能需要随时停止该线程,包括脚本执行。如何做到这一点?第一个想法是Thread.Abort(),但它被认为是邪恶的... 最佳答案 Whatisasafewaytostoparunningthread?将线程放在自己的进程中。当您希望它停止时,终止进程。这是终止线程的唯一安全方法。中止线程会严重破坏进程的稳定性并丢失用户数据。如果您真的、真的需要能够杀死一个可以做任何事情的线程,那么就没有办法避免“丢失用户数据”的情况。避免调用中止的进程不稳定的唯一方法是使它们完全不同

c# - 拥有无限工作线程的正确方法?

我有一个需要大量初始化的对象(在功能强大的机器上需要1-2秒)。虽然一旦初始化,完成一项典型的“工作”只需要大约20毫秒为了防止它在每次应用程序想要使用它时都被重新初始化(在典型使用情况下可能是每秒50次或几分钟根本不初始化),我决定给它一个任务,并且让它在自己的线程上运行,检查队列中是否有任何工作。但是,我不完全确定如何创建一个在有或没有工作的情况下无限期运行的线程。这是我目前的情况,欢迎大家批评privatevoidDoWork(){while(true){if(JobQue.Count>0){//doworkonJobQue.Dequeue()}else{System.Threa

c# - List<t> 可以被多个线程访问吗?

我打算在多个线程之间共享一个列表。该列表将在更改期间被锁定,这种更改很少发生。如果同时从列表中的不同线程进行多次迭代,是否存在线程安全问题? 最佳答案 如果可以(如果可以使用.NET4),请使用BlockingCollection:Providesblockingandboundingcapabilitiesforthread-safecollectionsthatimplementIProducerConsumerCollection.如果没有,则完全封装列表并添加访问List's的线程安全方法状态。不要公开对列表的引用或从任何方

c# - AsParallel() - 在 asp.net 中有 2 个以上的并行线程

我有一个方法,我用不同的参数调用了8次。我用AvailableYears.AsParallel().Select(x=>GetDataForYearWorker(x,CIF)).ToList();GetDataForYearWorker从网络服务同步获取响应。它在我的asp.net应用程序上使用很少的计算能力,但通常每个Web服务响应需要3-5秒。因为对web服务的调用是相互独立的,所以我想同时调用它们。但看起来只能同时运行2个线程。为什么会这样,我如何让8个线程同时工作? 最佳答案 默认情况下,.AsParallel()将在运行查

c# - 更改控制台颜色在多线程应用程序中无法正常工作

我正在开发多线程应用程序(服务器),它基本上是一个控制台应用程序。我在其中向控制台显示处理日志,默认情况下为白色。但在成功的交易中,我以绿色显示文本,在不成功的交易中,我以红色显示文本。为此,我在Program.cs中设置了三个独立的函数。对于简单的日志publicstaticvoidWrite(stringtext){try{Console.Out.Write(text);}catch(Exception){}}对于不成功的交易,我将颜色更改为红色,然后打印,然后变回白色publicstaticvoidWriteError(stringtext){Console.Foreground

c# - 在单元测试中确定线程安全

我正在编写一个多线程应用程序,我也在尝试找出如何为其编写合适的单元测试。我认为这可能是关于如何最好地做到这一点的另一个问题。还有一个问题,我有一个像下面这样的类,知道它不是线程安全的,想在单元测试中证明它,但不知道如何去做:publicclassMyClass{privateListMyList=newList();publicvoidAdd(stringData){MyList.Add(Data);//Thisisnotthreadsafe!!}} 最佳答案 证明某些东西是线程安全的是棘手的——可能很难停止问题。您可以证明竞争条件

c# - .NET DateTime 线程安全吗

.NETDateTime线程安全吗?如果read操作返回不正确的值,我并不担心,我唯一担心的是:如果不同步,DateTime对象是否会损坏。 最佳答案 读取和写入DateTime字段不是原子的(至少在32位系统上)。如果您同时从多个线程分配同一个属性,您可能会破坏它。如果您从一个线程读取并从另一个线程写入,读取线程可能会获得损坏的值。从多个线程读取而同时没有写入线程是安全的。本质上,当同时从多个线程使用时,DateTime的两个32位半部分可能包含不同年龄的值。您可以混合使用两种写入方式。一个写的高32位部分,另一个写的低32位部分