草庐IT

虚拟号安全

全部标签

c# - C# List<T> 的线程安全给读者

我计划在静态构造函数中创建一次列表,然后让该类的多个实例同时读取它(并枚举它)而不进行任何锁定。在本文中http://msdn.microsoft.com/en-us/library/6sh2ey19.aspxMS是这样描述线程安全问题的:Publicstatic(SharedinVisualBasic)membersofthistypearethreadsafe.Anyinstancemembersarenotguaranteedtobethreadsafe.AListcansupportmultiplereadersconcurrently,aslongasthecollectio

c# - 只读 HashSet 本身是线程安全的吗?

如果我初始化一个HashSet在Lazy里面初始化程序,然后从不更改内容,是HashSet本质上是线程安全的?是否有需要锁定的读取操作?类似的Java问题here对于一般的集合,这基本上是肯定的,但有一些警告(不适用于这种情况)。 最佳答案 是的,是的。只要施工了HashSet对象是线程安全的,只要内容不变,访问它就始终是线程安全的。如果你initializeLazy使用LazyThreadSafetyMode.PublicationOnly你可以确定Lazy的初始化是线程安全的。Whenmultiplethreadstrytoin

c# - 在 HashSet<T> 中是否包含线程安全

查看Contains的代码在HashSet.NET源代码中的类,我找不到任何原因Contains不是线程安全的吗?我正在加载HashSet提前使用值,然后检查Contains在多线程中。AsParallel()循环。这有什么不安全的原因吗?我不愿意使用ConcurrentDictionary当我实际上不需要存储值时。 最佳答案 通常(通常)仅用于读取的集合是“非官方”线程安全的(我知道.NET中没有任何集合在读取期间会自行修改).有一些注意事项:项目本身可能不是线程安全的(但对于HashSet,这个问题应该被最小化,因为你不能从中提

c# - 为什么我不能像在方法上那样在类变量上使用虚拟/覆盖?

在下面的示例中,我可以在inherited类中创建一个virtual方法Show(),然后override它在继承类中。我想用protected类变量prefix做同样的事情,但我得到了错误:Themodifier'virtual'isnotvalidforthisitem但是因为我不能在我的类中将这个变量定义为virtual/override,所以我得到了编译器警告:TestOverride234355.SecondaryTransaction.prefix'hidesinheritedmember'TestOverride234355.Transaction.prefix'.Use

c# - 为什么结构的 sizeof 是不安全的

MSDN明确指出Forallothertypes,includingstructs,thesizeofoperatorcanonlybeusedinunsafecodeblocks.C#LanguageSpecification更精确:成员打包到结构中的顺序是未指定的。出于对齐目的,开头可能有未命名的填充结构的一部分、结构内的和结构的末尾。用作填充的位的内容是不确定的。当应用于具有结构类型的操作数时,结果是该类型变量中的字节总数,包括任何填充。但是CLR将如何处理以下结构:[StructLayout(LayoutKind.Explicit,Size=1,Pack=1)]publicst

c# - Asp.Net Core 中的 IP 安全

我正在尝试通过IP地址限制站点。在以前的MVC版本中,我会在web.config中添加如下内容:但是将其添加到AspNetCore项目会导致应用程序启动失败并出现错误UnabletostartprocessThewebserverrequestfailedwithstatuscode500,internalservererror显然我破坏了配置,因为它不再在这里处理。该错误会生成一个HttpFailure日志,如下所示:现在处理这个问题的最佳方法是什么,内置的还是其他的 最佳答案 DamianBod制作了一个blogpost演示如何

c# - C# 数组中的线程安全

是否有2个不同的线程:从C#数组读取(例如从第一个位置),另一个写入同一个C#数组但写入不同的位置(例如最后一个位置)线程安全吗?(我的意思是这里没有锁定读取或写入) 最佳答案 这个特殊情况是安全的,是的。读取和写入数组的不同部分不会干扰其他操作。但是,读取和写入同一位置可能会给您带来问题,具体取决于元素的类型和元素的大小。 关于c#-C#数组中的线程安全,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

c# - 显式接口(interface)实现不能是虚拟的

郑重声明,我已经看过这个connectitem但我真的不明白支持这个会有什么问题。假设我有以下代码:publicinterfaceIInterface{voidMethod();}publicclassBase:IInterface{virtualvoidIInterface.Method(){thrownewNotImplementedException();}}虚拟标识符有什么问题?使用virtual修饰符可以override指示基类中有不同的实现。我现在可以通过删除虚拟方法并像这样创建派生类来使其工作:publicclassDerived:IInterface{voidIInte

c# - 静态变量的线程安全初始化

我一直在使用这种模式来初始化我的类中的静态数据。它对我来说看起来是线程安全的,但我知道线程问题有多么微妙。这是代码:publicclassMyClass//badcode,donotuse{staticstring_myResource="";staticvolatilebool_init=false;publicMyClass(){if(_init==true)return;lock(_myResource){if(_init==true)return;Thread.Sleep(3000);//someoperationthattakesalongtime_myResource="H

c# - 这个操作线程安全吗?

在以下示例中,当单击“提交”按钮时,静态变量Count的值会递增。但是这个操作线程安全吗?使用Appliation对象是执行此类操作的正确方法吗?这些问题也适用于Web表单应用程序。当我点击“提交”按钮时,计数似乎总是在增加。View(Razor):@{Layout=null;}@ViewBag.BeforeCountController:publicclassHomeController:Controller{publicActionResultIndex(){ViewBag.BeforeCount=StaticVariableTester.Count;StaticVariableT