当前位置: 首页 > 编程语言 > C#

ASP.NET锁线程方法分享

时间:2023-04-10 13:01:54 C#

ASP.NET锁线程方法我正在使用C#开发ASP.NETformweb应用程序。我有一个为客户创建新订单的方法。它看起来与此相似;privatestringCreateOrder(stringuserName){//获取当前订单Orderorder=FetchOrder(userName);if(order.OrderId==0){//还没有订单,新建一个订单.OrderNumber=Utility.GenerateOrderNumber();订单.保存();}退货单;这里的问题是,1个客户在两个请求(线程)中可能会导致这个方法被调用两次,而另一个线程也有可能在这个方法中。这可能会导致创建两个订单。我如何正确锁定此方法,以便每个客户端一次只能由一个线程执行?我试过;互斥量mutex=null;privatestringCreateOrder(stringuserName){if(mutex==null){mutex=newMutex(true,userName);}mutex.WaitOne();//来自上面互斥量的代码。ReleaseMutex();互斥=空;退货单;这行得通,但在某些情况下它挂在WaitOne上,我不知道为什么。是否存在错误,或者我应该使用其他方法进行锁定?感谢您在mutexinitiallyOwned时传递false。如果您创建互斥量并最初拥有互斥量,则需要再次调用ReleaseMutex。释放互斥锁时,您应该始终尝试。另外,确保密钥是正确的(userName)Mutexmutex=null;privatestringCreateOrder(stringuserName){mutex=mutex??新互斥体(真,用户名);mutex.WaitOne();try{//上面的代码}finally{mutex.ReleaseMutex();}互斥锁=空;退货单;在您的代码中,您正在懒惰地创建互斥锁。这导致了竞争条件。例如,当您从另一个线程调用WaitOne()时,可能会部分构建互斥锁。您还可以创建两个互斥锁实例。等等......您可以通过急切地创建实例来避免这种情况-例如在迈克尔的代码中。(确保将其初始化为非拥有状态。)Mutex是内核级同步原语-它比Monitor(锁使用的是Monitor)更昂贵。除非我遗漏了什么,否则你不能只使用普通锁吗?私有对象_locker=newobject();privatestringCreateOrder(stringuserName){lock(_locker){//获取当前订单Orderorder=FetchOrder(userName);if(order.OrderId==0){//还没有订单,新建一个order.OrderNumber=Utility.GenerateOrderNumber();订单.保存();}退货单;您认为通过锁定CreateOrder可以获得什么?在我看来,你可以避免同时创建两个订单,但你最终还是会创建两个订单。这样做更容易:在某个地方定义一个类:publicclassMyLocks{publicstaticobjectOrderLock;staticMyLocks(){OrderLock=newobject();}}然后在使用锁时执行此操作:lock(MyLocks.OrderLock){//将您的代码放在这里}这不是很复杂。它的重量非常轻,并且可以为任何目的定义锁,因为它们只是内存中非常小的对象,可以跨多个线程存在。以上就是C#学习教程:ASP.NET锁线程方法分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: