多线程、Handler机制、ThreadLocal
全部标签 阅读MSDN文档时,它总是让您知道某个类是否是线程安全的。我的问题是你如何设计一个线程安全的类?我不是在谈论用锁定调用类我的意思是我正在为MicrosoftcreateXXXclass\object工作,我想说它是“线程安全的”我需要做什么? 最佳答案 使类线程安全的最简单和最万无一失的方法是使其成为immutable.它的美妙之处在于您不必再为锁定而烦恼。秘诀:在C#中将所有实例变量设置为readonly(在Java中为final)。不可变对象(immutable对象)一旦在构造函数中创建和初始化,就无法更改。不可变对象(immu
如果线程正在运行通过退出usingblock释放的对象中的方法,线程会发生什么情况?示例:using(SomeObjectobj=newSomeObject()){obj.param=10;ThreadnewThread=newThread(()=>{obj.Work();});newThread.Start();}...obj.Work()在新线程上运行,但obj是一个IDisposable对象,通常会在usingblock退出时释放。如果线程在usingblock结束后继续运行会怎样?只有在线程完成后对象才会被释放吗?还是会断线?谢谢。 最佳答案
我是CSharp和线程的新手。为了熟悉Monitor.Wait、Monitor.lock和Monitor.PulseAll,我构建了一个场景描述如下。“一个FootballGround由不同的球队共享用于练习目的。任何时候只有一个球队可以使用field进行练习。一个团队可以使用field进行30分钟的练习。一旦时间达到25分钟,它应该向其他球队发出信号地面将在5分钟后释放的线程。本地面潮湿时(枚举有三个值free、alloted、wet)不允许任何团队锁定地面,所有人都应等待10分钟”老实说,我不知道如何将描述转化为实际编码。根据我的理解,我设计了大纲。namespaceThreadi
我完全不解。我非常确定,如果线程中存在未捕获的异常,.NET会关闭整个应用程序域,因此我从未测试过。但是我只是尝试了下面的代码并没有失败...谁能解释一下为什么?(在.NET4和3.5中试过)staticvoidMain(string[]args){Console.WriteLine("Mainthread{0}",Thread.CurrentThread.ManagedThreadId);Actiona=newAction(()=>{Console.WriteLine("Backgroundthread{0}",Thread.CurrentThread.ManagedThreadId
我创建了一个使用.NETMemoryCache的异步缓存。这是代码:publicasyncTaskGetAsync(stringkey,Func>populator,TimeSpanexpire,objectparameters){if(parameters!=null)key+=JsonConvert.SerializeObject(parameters);if(!_cache.Contains(key)){vardata=awaitpopulator();lock(_cache){if(!_cache.Contains(key))//Checkagainbutlockedthist
我希望这项工作在不同的线程中完成,但我必须创建一个线程还是它在不同的线程中完成所有工作?喜欢:ThreadfileThread=newThread(()=>{FileWatcher=newFileSystemWatcher();FileWatcher.Created+=OnFileEvent;FileWatcher.Deleted+=OnFileEvent;FileWatcher.Renamed+=OnRenameEvent;FileWatcher.EnableRaisingEvents=true;});fileThread.Start(); 最佳答案
在某些情况下,我需要将进程的语言环境设置为en-US。我知道如何为当前线程执行此操作:System.Threading.Thread.CurrentThread.CurrentCulture=System.Globalization.CultureInfo.CreateSpecificCulture("en-US");但我的应用程序使用BackgroundWorkers进行一些处理,并且这些工作线程的语言环境似乎不受上述对其生成主线程的更改的影响。那么我如何才能为我的应用程序中的所有线程设置语言环境,而无需在每个线程中手动设置呢? 最佳答案
我在这里问了一个很糟糕的问题Lockonavariableinmultiplethreads所以为了清楚起见,我将在这里提问,希望我能正确提问。classAcreatesinstanceofclassBhasmethodAthatcanupdate&usesclassB'smyVarhasmethodBthatcanupdate&usesclassB'smyVarclassBhasavariablemyVarmethodA和methodB都可以在单独的线程中运行(在主线程中调用)。我如何确保这是线程安全的? 最佳答案 使用lock关
我有一个应用程序在单独的Thread中执行一些后台任务(网络监听和读取)。然而,当我关闭应用程序(单击标题栏上的“x”按钮)时,线程似乎没有被终止/中止。那是因为主线程例程是while(true){...}吗?这里的解决方案是什么?我一直在寻找线程的一些“中断”标志作为“while”循环的条件,但没有找到。 最佳答案 最简单的方法是设置IsBackground线程的属性为真。这将阻止它保持应用程序打开。当所有非后台线程终止时,应用程序终止。停止线程的一种更可控的方法是向它发送一条消息以彻底关闭并确保它在让您的主线程终止之前已终止。我
我可以在不锁定的情况下从多个线程安全地调用List.AddRange(r)吗?如果不是,我会遇到什么样的麻烦? 最佳答案 否,itsdocumentation没有说它是线程安全的,因此它不是。Publicstatic(SharedinVisualBasic)membersofthistypearethreadsafe.Anyinstancemembersarenotguaranteedtobethreadsafe.至于哪里会出错,想想AddRange(newItems)做了什么:检查内部数组是否有足够的空间如果不是:分配一个新数组将