应用程序挂在 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
我正在使用 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