我正在使用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();
}
}
}
答案 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