应用程序挂在 Lock 语句上

Application hangs on Lock statement

我正在使用 c# compact 框架和 vs2008。我正面临 Lock 声明的问题。我的应用程序大部分时间都在工作,但有时仍然会挂起。

我试过这些

1) Lock(this)
2) lock (Core.Processor.Input.GPSIDInput.gps)
3) Monitor.TryEnter(Core.Processor.Input.GPSIDInput.gps);
try{}
finally{ Monitor.Exit(this); }

为什么我正在使用"try catch block",当锁失败时它不出来。

Gps.cs

[DllImport("coredll.dll")]
static extern int CloseHandle(IntPtr hObject);

public void Close()
{
    try
    {
        lock (Core.Processor.Input.GPSIDInput.gps)
        {

            if (newLocationHandle != IntPtr.Zero){
            CloseHandle(newLocationHandle);
            newLocationHandle = IntPtr.Zero;
            }......

        }
    }
    catch (Exception excpt)
    {
    //stack trace
    }
}

GPSIDInput.cs

namespace Core.Processor.Input
{
    public class GPSIDInput
    {
        .......
        public static Gps gps = new Gps();

        public static void CloseGPS()
        {
            gps.Close();
        }
    }
}

Lock 就像一个临界区。只有一个线程可以 'hold the lock'。当一个线程这样做时,另一个试图持有锁的线程必须等到另一个线程释放它。没有 'failing' 锁这样的东西,它只是等待持有它的线程释放它。

如果你只是担心两个线程同时尝试释放句柄,那么只是一个猜测来解决问题然后使用这样的东西:

object closeLockObj = new object();
public void Close()
{
    try
    {
        lock (closeLockObj)
        {

            if (newLocationHandle != IntPtr.Zero){
            CloseHandle(newLocationHandle);
            newLocationHandle = IntPtr.Zero;
            }......

        }
    }
    catch (Exception excpt)
    {
    //stack trace
    }
}

如果其他代码在 Core.Processor.Input.GPSIDInput.gps 上获取锁,可能会导致您的应用程序挂起。所以最好使用单独的 lockObject