【问题标题】:C# Monitor behavior in case user quits applicationC# 监控用户退出应用程序时的行为
【发布时间】:2012-11-05 10:42:53
【问题描述】:

我将以下代码用于网页的关键部分

if(Monitor.TryEnter(lockObj,60000))
{
  try{
       //write some things to a file
     }
  finally
  {
    Monitor.Exit(lockObj);
  }
}

这里,lockObj 是类的静态成员。我的问题是,如果用户在执行关键部分时关闭网页或浏览器会发生什么? lockObj 是否对未来的页面请求保持锁定状态?

【问题讨论】:

  • 页面在做什么?一个GET?一个帖子?上传文件?
  • 在临界区,它正在写入服务器上的日志文件
  • 是的,但是用户在做什么?只是发出页面请求?是否有任何东西被发送回给用户?我看不到您的服务器甚至会如何知道用户是否关闭了页面,就它所关心的而言,它只会发送它本来要发送的响应。
  • 为什么不使用lock() { ... }?和你自己写的一样
  • 如果这很重要,我假设微软会实现 IDisposable 接口,以便您可以使用 using 关键字。

标签: c# asp.net synchronization try-finally


【解决方案1】:

如果请求仍在处理中,当用户关闭浏览器窗口或导航到另一个页面时,不会自动发生任何事情。这就是 HttpResponse.IsClientConnected 属性存在的原因 - 因此您的代码可以在您可以做一些有用的事情时执行适当的检查。

如果服务器端发生超时,那么finally 块应该在那个时间左右运行并且锁将被释放。此时释放锁是否安全只有您可以确定 - 锁一定是出于某种原因放在那里的,如果发生超时,这可能意味着 (共享,需要锁的状态)对于下一个获得锁的人来说是不稳定的。

但这是两组截然不同的问题。

【讨论】:

    【解决方案2】:

    如果你设法杀死了里面的执行线程

    try {
      //write some things to a file
    }
    

    您可能有一些问题。但对于所有有例外的实际情况,代码都会起作用。

    实际上,避免Thread.Abort

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多