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