草庐IT

Thread_safety

全部标签

c# - 有没有办法在 c# 中获取所有线程的堆栈跟踪,比如 java.lang.Thread.getAllStackTraces()?

在Java中,可以获得所有正在运行的线程的堆栈跟踪的快照。这是用java.lang.Thread.getAllStackTraces()完成的(它返回Map)。如何使用.net完成此操作? 最佳答案 所以我实际上只需要弄清楚如何做到这一点——还没有在生产中广泛使用这个解决方案,但是有一个相对较新的库,叫做ClrMd。http://blogs.msdn.com/b/dougste/archive/2013/05/04/clrmd-net-crash-dump-and-live-process-inspection.aspx使用它,我能

c# - Thread.Sleep 或 Thread.Yield

我有一个方法,它使用后台工作程序轮询DLL以获取如下所示的状态:vartimeout=DateTime.Now.AddSeconds(3);while(System.Status!=Status.Complete//ourstatusisnotcomplete&&DateTime.Now查看我的CPU%时,yield()和spinwait()导致我的应用在我的PC上使用率高达50%。使用Sleep(1),我的CPU%保持在6%。有人告诉我应该选择Thread.Yield(),但是CPU%的峰值让我很困扰。像这样的最佳做法是什么? 最佳答案

c# - 是 Thread.Sleep(Timeout.Infinite);比 while(true){} 更有效?

我有一个控制台应用程序,我想在监听事件的同时一直保持打开状态。我已经测试了Thread.Sleep(Timeout.Infinite);和while(true){}并且都允许在保持控制台应用程序打开的同时引发事件。有没有我应该优先使用的?如果线程正在休眠,是否有任何我不应该做的事情,例如修改类范围内声明的静态集合? 最佳答案 我建议使用ManualResetEvent(或其他WaitHandle),并调用ManualResetEvent.WaitOne.这将具有与永远sleep类似的效果,除了它为您提供了一种干净的方式,可以在需要时

c# - BackgroundWorker 和 System.Threading.Thread 之间的区别

使用BackgroundWorker创建线程和使用System.Threading.Thread创建线程有什么区别? 最佳答案 BackgroundWorker类基本上抽象了Thread创建和监控过程,并为您提供一个事件驱动的API来报告操作的进度(ProgressChanged)并确定您的操作何时完成(RunWorkerCompleted)...它最常见的用途之一是在长时间运行的进程在后台执行时保持WindowsGUI响应。所以基本上,它只是System.Threading.Thread的包装器,旨在使后台线程更简单一些(顾名思义

c# - Thread.VolatileRead()与Volatile.Read()

在大多数情况下,我们被告知比Volatile.Read更喜欢Thread.VolatileRead,这是因为后者散发出全围栏,而前者仅散发相关的半围栏(例如,获取围栏);效率更高。但是,据我所知,由于Thread.VolatileRead的实现,Volatile.Read实际上提供了Thread.VolatileRead不提供的某些功能:publicstaticintVolatileRead(refintaddress){intnum=address;Thread.MemoryBarrier();returnnum;}由于实现的第二行有完整的内存屏障,我相信VolatileRead实际

c# - Thread.Sleep 少于 1 毫秒

我想在不到1毫秒的时间内调用线程休眠。我读到thread.Sleep和Windows操作系统都不支持它。解决方案是什么?对于所有想知道我为什么需要这个的人:我正在进行压力测试,想知道我的模块每秒可以处理多少条消息。所以我的代码是://SettherelativepartofSecondhatwillbeallocatedforeachmessage//Forexample:5messages-everymessagewillget200milisecondsvarquantum=1000/numOfMessages;for(vari=0;i我很乐意听取您的意见。

c# - 使用 SocketAsyncEventArgs 时是否可以删除 ExecutionContext 和 Thread 分配?

如果您分析一个使用SocketAsyncEventArgs的简单客户端应用程序,您会注意到Thread和ExecutionContext分配。分配的来源是SocketAsyncEventArgs.StartOperationCommon,它使用ExecutionContext.CreateCopy()创建ExecutionContext的副本。ExecutionContext.SuppressFlow似乎是抑制此分配的好方法。但是,此方法本身会在新线程中运行时生成分配。如何避免这些分配? 最佳答案 SocketAsyncEventA

c# - 使用 Thread.Sleep() 总是不好的吗?

我为Random类创建了一个扩展方法,它随机执行一个Action(voiddelegate):publicstaticclassRandomExtension{privatestaticbool_isAlive;privatestaticTask_executer;publicstaticvoidExecuteRandomAsync(thisRandomrandom,intmin,intmax,intminDuration,Actionaction){TaskouterTask=Task.Factory.StartNew(()=>{_isAlive=true;_executer=Tas

c# - 为什么 Thread.CurrentPrincipal 需要 "await Task.Yield()"才能正确流动?

以下代码已添加到新创建的VisualStudio2012.NET4.5WebAPI项目中。我正在尝试同时分配HttpContext.Current.User和Thread.CurrentPrincipal在异步方法中。Thread.CurrentPrincipal的赋值除非awaitTask.Yield();否则流程不正确(或任何其他异步)被执行(将true传递给AuthenticateAsync()将导致成功)。这是为什么?usingSystem.Security.Principal;usingSystem.Threading.Tasks;usingSystem.Web.Http;n

Java中Thread详解(一篇就够了)

前言操作系统中,一个进程往往代表着一个应用程序实例,而线程是进程中轻量级的调度单元,也可以看作是轻量级的进程,可以共享进程资源。下面简单介绍在操作系统中线程通用实现方式。接下来内容主要对线程模型进行简单介绍,然后对Java线程实现Thread类进行了解。线程模型暂且抛开Java线程,先说明一下在操作系统中,线程通用的几种实现方式。实现线程主要有三种方式。内核线程模型使用内核线程实现的方式,通常也被成为1:1实现模型。内核线程(KernelLevelThread,KLT)是直接由操作系统内核来支持的线程,这种线程由内核来控制切换,内核通过调度器(Scheduler)来对线程进行调度,并负责将线程