草庐IT

syscall_thread_switch

全部标签

c# - Thread.Abort 与 Thread.Interrupt

如果我需要取消线程上的一些操作,我应该什么时候使用Thread.AbortvsThread.Interrupt。我阅读了有关它的文档,但不确定我应该使用哪个scneario在两者之间进行特定调用。如果有任何第三种方法,请让我也知道它的优缺点。 最佳答案 我会不惜一切代价避免使用Thread.Abort。自.NET2.0以来,它的行为更加安全和可预测,但它仍然存在一些非常严重的缺陷。托管代码中的大多数中止都可以安全处理,但不是全部。例如,如果在静态构造函数的处理过程中触发了中止请求,我认为会有一些微妙的问题。没关系,事实上,带外异常随

c# - 如何在子类的工厂方法中避免 switch-case

假设我们有一组类(卡片,为了它),我们需要根据一些标识符来实例化它们。工厂方法看起来像这样:publicCardGetCard(intcardNumber){switch(cardNumber){case13:returnnewKing();case12:returnnewQueen();case11:returnnewJack();}//...}我想要的是避免这个开关。为什么?也许我想在功能中重用这个比较。我想出的是这样的:privateDictionarycardTypes={{13,typeof(King)},{12,typeof(Queen)},{11,typeof(Jack)

c# - Lock vs. ToArray for thread safe foreach access of List collection

我有一个List集合,我想在多线程应用程序中对其进行迭代。我每次迭代它时都需要保护它,因为它可能会被更改,而且我不希望在执行foreach时出现“集合已修改”异常。正确的做法是什么?每次访问或循环时都使用锁。我非常害怕死锁。也许我只是对使用lock偏执,不应该。如果我走这条路以避免死锁,我需要知道什么?锁是否相当有效?每次执行foreach时,都使用List.ToArray()复制到一个数组。这会导致性能下降,但很容易做到。我担心内存抖动以及复制它的时间。只是显得过分。使用ToArray是线程安全的吗?不要使用foreach,而是使用for循环。每次执行此操作时我不需要进行长度检查以确

c# - 可移植类库中的 Thread.Sleep()

MSDN文档说Thread.Sleep()可以在可移植类库中使用。编译器另有说明。除了自旋循环,我还有哪些选择?Thread.CurrentThread.Join()也不存在。项目文件:DebugAnyCPU{C46B138E-CC30-4397-B326-8DD019E3874B}LibraryPropertiesx0xtest.AVRx0xtest.AVRv4.0Profile3512{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}truefullfalsebin\Debug\

c# - 为什么 switch for enum 接受隐式转换为 0 但不接受任何其他整数?

有一个:enumSomeEnum{A=0,B=1,C=2}现在编译器允许我写:SomeEnumx=SomeEnum.A;switch(x){case0://0被认为是SomeItems.A。但我不会写:SomeEnumx=SomeEnum.A;switch(x){case0:break;case1://为什么只有0存在隐式转换? 最佳答案 来自ECMA-334(C#LanguageSpecification)13.1.3ImplicitenumerationconversionsAnimplicitenumerationconver

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# - 使用 Action 字典而不是 switch 语句

我正在审查我的一些旧代码(有一些空闲时间),我注意到一个相当冗长的switch语句。由于获得了新知识,我将其重构为以下形式:privateDictionarycreateView{get{returnnewDictionary(){{"Standard",CreateStudySummaryView},{"ByGroup",CreateStudySummaryByGroupView},{"ByGroup/Time",CreateViewGroupByHour}};}}您认为这是一种良好的做法,还是仅仅是一种多余且不必要的情况?我热衷于确保我学习的新技术不是为了聪明而聪明,而是它们实际上

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# - "switch"语句评估线程安全吗?

考虑以下示例代码:classMyClass{publiclongx;publicvoidDoWork(){switch(x){case0xFF00000000L://dowhatever...break;case0xFFL://dowhatever...break;default://notifythatsomethinggoingwrongthrownewException();}}}忘记代码片段的无用性吧:我怀疑的是switch语句的行为。假设x字段只能有两个值:0xFF00000000L或0xFFL。上面的开关不应该属于“默认”选项。现在假设一个线程正在执行“x”等于0xFFL的