WinForms lock detector
A nice and pretty simple C# class to detect if a GUI thread can not process window messages (and user actions).
Introduction
If your application performs long operations sometimes and you do not want to spend time writing specialized code to show an indicator in every such place, then this class might help you.
Background
The idea is very simple. User actions such as keyboard and mouse events are just window messages. So, we can assume that your application is locked (processing a long operation) when your GUI thread (main thread, in most cases) can not process window messages.
The LockDetector
class periodically calls BeginInvoke
on some control from the target thread to send a window message. Then, if the delegate has not been called during a specified timeout interval, the OnLockDetected
event is called in the detector thread and then can be processed in parallel with the thread being monitored.
Using the code
Check this very short example of how to use the class:
private LockDetector detector;
private void TestForm_Load(object sender, EventArgs e)
{
detector = new LockDetector(this, 300); // detection timeout - 300ms
detector.OnLockDetected += new
LockDetector.onLockDetectedDelegate(detector_OnLockDetected);
detector.OnLockFinished += new
LockDetector.onLockFinishedDelegate(detector_OnLockFinished);
detector.Start();
}
private void TestForm_FormClosing(object sender, FormClosingEventArgs e)
{
detector.Dispose();
detector = null;
}
void detector_OnLockFinished()
{
MessageBox.Show("FINISHED");
}
void detector_OnLockDetected()
{
MessageBox.Show("DETECTED");
}
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(5000);
}
The sources include a more advanced example.
History
- 06 Apr 2008 - Initial release.