I have some sample source code below with 2 lock statements. During my test run I click 'r1RefreshButton' to put showReport1 method into a forever loop. Then I click 'r2RefereshButton' to check if lock is doing as intended.
I found out that the lock on showReport2 does not really lock. Did I miss something?
public partial class TestReportsForm : Form
{
private static readonly Object thisLock = new Object();
public TestReportsForm() { InitializeComponent(); }
private void showReport1()
{
lock (thisLock)
{
r1RefreshButton.Enabled = false;
try
{
// while loop is used to simulate long process
while (true)
{
Application.DoEvents();
}
}
catch (Exception ex)
{
String errorMessage = "Error encountered\n\n" +
"Error details: \n" +
ex.Message;
MessageBox.Show(this, errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
r1RefreshButton.Enabled = true;
}
}
}
private void r1RefreshButton_Click(object sender, EventArgs e)
{
showReport1();
}
private void showReport2()
{
lock (thisLock)
{
r2RefreshButton.Enabled = false;
try
{
Application.DoEvents();
// long process here
}
catch (Exception ex)
{
String errorMessage = "Error encountered\n\n" +
"Error details: \n" +
ex.Message;
MessageBox.Show(this, errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
r2RefreshButton.Enabled = true;
}
}
}
private void r2RefreshButton_Click(object sender, EventArgs e)
{
showReport2();
}
}
EDIT: I found similar topic from C# Locking from events