微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

释放锁而不执行方法

如何解决释放锁而不执行方法

我正在使用的系统由托管各种 WCF 服务的 Windows 服务组成。多个客户端可以与同一个服务对话,但一次只能有一个客户端与一个服务对话。
因此我使用了“lock()”来防止多个客户端发生冲突。如果 Client1 向服务发出第一个请求,然后 Client2 在前者仍在执行时发出另一个请求,则“锁定”会将第二个请求搁置,直到第一个请求完成。

到目前为止一切顺利。现在的问题是我必须处理事件(我不认为简单的回调可以解决这个问题)。
换句话说,当第一个请求正在运行时,可能会发生一些客户端 2 需要知道的事情。
发生这种情况时,Client2 将收到该事件,并最终应停止使用该服务。
这里的问题是我们的第二个请求已经在储物柜的队列中。
那么我将如何防止第二个请求运行。可以取消吗?
也许这只是添加一个脏标志的问题,但我希望有更好的方法来做到这一点。
下面是带有脏标志“canRun”的服务端的样子:

lock (_locker)
{ 
    if (canRun)
       return SomeMethod();
    else
       return null;
}

解决方法

如果您可以切换到 IQueryable data = _context.Orders; IQueryable<SelectList> dataSource = (from t in _context.Orders select new { t.OrderID,t.CustomerID,t.EmployeeID,t.ShipCity,CustomerName = t.Employees.FirstName,EmployeeName = t.Employees.FirstName + " " + t.ShipCity,cashier = _context.Orders.Where(c => c.OrderID == t.OrderID).Select(c => c.CustomerID + " " + c.ShipCity) }).Select(t => new SelectList() { CustomerName = t.CustomerName,ShipCity = t.ShipCity,EmployeeName = t.EmployeeName,**Exceeded = t.EmployeeID > 5 ? "Yes" : "No"** }).AsQueryable(); /async 和诸如 await 之类的东西,那么:SemaphoreSlim 就是您要寻找的;可以随时将 CancellationToken 标记为取消,并且代码可以相应地做出响应 - 大多数框架/库代码已经正确处理取消,例如:在异步信号量获取期间。

如果您需要坚持同步世界,那么您最好的选择可能是更改为可以重新检查每次超时的循环 CancellationTokenSource 模式,例如:

Monitor

请注意,如果 bool lockTaken = false; try { do { if (!canRun) throw new OperationCanceledException(); Monitor.TryEnter(_locker,someTimeout,ref lockTaken); } while (!lockTaken); // now we have the conch SomeMethod(); } finally { if (lockTaken) Monitor.Exit(_locker); } 是一个字段,您需要确保它是 canRun 或以其他方式适当访问以避免被缓存在寄存器或类似物中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。