草庐IT

并发锁

全部标签

c# - HttpWebResponse 不会针对并发出站请求进行扩展

我有一个用C#编写的ASP.NET3.5服务器应用程序。它使用HttpWebRequest和HttpWebResponse向RESTAPI发出出站请求。我已经设置了一个测试应用程序来在单独的线程上发送这些请求(以模糊地模拟针对服务器的并发)。请注意,这更像是一个单声道/环境问题,而不是代码问题;所以请记住下面的代码不是逐字的;只是功能位的剪切/粘贴。这是一些伪代码://threadedclientpieceintnumThreads=1;ManualResetEventdoneEvent;using(doneEvent=newManualResetEvent(false)){for(i

c# - 在 ASP.NET 中每个用户只允许一个并发登录

在ASP.NETWeb应用程序中是否可以允许每个用户同时登录一次?我正在开发一个Web应用程序,我想在其中确保该网站一次只允许每位用户登录一次。如何检查当前用户是否已经登录?请建议我们可以处理此问题的正确登录方法。我认为我们应该使用SQLServersession状态来处理这个问题。你有什么建议?我想到了一个解决方案。我们可以这样做:当用户登录系统时,我们会在用户列中插入sessionID。(我们将使用数据库session,以便我们可以轻松获取所有session相关数据,如isexpired、expiredatetime等)。当同一个用户再次尝试登录时,我们将检查该sessionID列

c# - 乐观并发 : IsConcurrencyToken and RowVersion

我正在创建将在我的应用程序中使用的默认并发策略。我决定采用乐观策略。我的所有实体都映射为TableperType(TPT)(使用继承)。我很快了解到,在EntityFramework上使用带有继承的RowVersion类型的列时会出现问题:ProductIdINTIDENTITYPRIMARYKEYRowVersionROWVERSIONCar(inheritsProductrecords)ColorTYNIINTNOTNULL,AnotherProperty....   如果我更新Car表的记录,Product表中的RowVersion列将不会更新。我计划在Product中使用类型为

c# - 使用仅包含静态方法而不包含变量的 C# 类时会出现并发问题吗?

我是否正确理解所有线程都在自己的堆栈中复制方法变量,因此当从不同线程调用静态方法时不会出现问题? 最佳答案 是也不是。如果参数是值类型,那么是的,它们有自己的副本。或者,如果引用类型是不可变的,那么它就无法更改,您也没有问题。但是,如果参数是可变引用类型,则传入的参数仍然可能存在线程安全问题需要考虑。这有意义吗?如果您将引用类型作为参数传递,则它的引用是“按值”传递的,因此它是一个引用回旧对象的新引用。因此,您可能有两个不同的线程可能以非线程安全的方式更改同一个对象。如果这些实例中的每一个都是在使用它们的线程中仅创建和使用的,那么您

c# - 并发集合在没有 Thread.Sleep 的情况下吃太多 cpu

BlockingCollection或ConcurrentQueue的正确用法是什么,这样您就可以自由地使项目出队,而不会使用线程消耗一半或更多的CPU?我正在使用2个线程运行一些测试,除非我有至少50~100毫秒的Thread.Sleep,否则它总是会占用至少50%的CPU。这是一个虚构的例子:privatevoid_DequeueItem(){objecto=null;while(socket.Connected){while(!listOfQueueItems.IsEmpty){if(listOfQueueItems.TryDequeue(outo)){//usethedata}

c# - List<T> 并发删除和添加

我不太确定,所以我想我会问。将删除和添加项目到System.Collections.Generic.List对象是非线程安全的?我的情况:当收到一个连接时,它会被添加到列表中,但同时,还有一个工作人员正在删除死连接等。有问题吗?请问lock做?我还想知道我是否被允许使用列表对象上的锁Foreach方法。 最佳答案 是的,在List中添加和删除项目不是线程安全的,因此您需要同步访问,例如使用lock.注意lock关键字绝不会锁定您用作标识符的对象,它只会防止两个线程同时进入同一代码块。您将需要锁定访问列表的所有代码,使用相同的对象作为

c# - 如何在单元测试中为并发建模?

我对单元测试还很陌生,目前正在尝试使用VisualStudio的测试工具。我的问题是如何在这些测试中定义有关并发行为的断言。例如。上课BoundedChan实现有界channel,我如何指定像这样的测试“channel.Send不会阻止”或“如果超出channel的容量,channel.Send将阻塞直到读取值”是否有一个优雅的解决方案来编写这些断言? 最佳答案 不幸的是,并发性仍然是单元测试的一个领域,很难轻松构建。这不是一个简单的问题,仍然需要你在测试中实现一些自己的同步和并发逻辑。对于您提供的示例,可能无法编写最终证明某个方法

c# - File.AppendAllText 是否管理冲突(即多用户并发)?

问题File.AppendAllText是否管理来自多个作者的冲突?研究我注意到MSDNdocumentation并没有真正提供任何一种方式,所以我决定我会反射(reflect)代码并看看它做了什么。下面是从File.AppendAllText调用的方法:privatestaticvoidInternalAppendAllText(stringpath,stringcontents,Encodingencoding){using(StreamWriterstreamWriter=newStreamWriter(path,true,encoding)){streamWriter.Writ

c# - 从并发字典中获取所有值并在不丢失数据的情况下清除它

我正在向并发字典中添加/更新对象并定期(每分钟)刷新字典,所以我的代码看起来像这样:privatestaticConcurrentDictionary_metrics=newConcurrentDictionary();publicstaticvoidIncrementCountMetricBy(stringname,intcount){_metrics.AddOrUpdate(....}publicstaticMetric[]Flush(){varflushedMetrics=_metrics;_metrics=newConcurrentDictionary();returnflus

c# - Hangfire 禁用并发执行 : What happens when the timeout expires?

根据Hangfire0.8.2announcementpost,Hangfire有一个DisableConcurrentExecution过滤器,当应用于一个方法时,它会阻止该方法的多个实例同时执行。DisableConcurrentExecution过滤器采用timeoutInSecondsint参数。来自链接文章中的示例:[DisableConcurrentExecution(timeoutInSeconds:10*60)]publicvoidSomeMethod(){//Operationsperformedinsideadistributedlock}我的问题是:给定一个正在等