应用程序挂起在Lock语句中

时间:2015-01-27 12:45:33

标签: c# compact-framework

我正在使用c#compact framework和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); }

为什么当我使用锁定失败时它不会出现"尝试捕获块"。

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();
        }
    }
}

2 个答案:

答案 0 :(得分:4)

Lock就像一个关键部分。只有一个线程可以“锁定”锁定。当一个线程执行时,另一个试图保持锁定的线程必须等到另一个线程释放它。没有'失败'锁,只是等待持有它的线程,释放它。

答案 1 :(得分:3)

如果您只是担心两个线程同时尝试释放句柄然后使用类似的东西,那么只需要猜测解决问题:

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