gpt4 book ai didi

c# - lock 语句未按预期工作

转载 作者:行者123 更新时间:2023-12-02 19:35:30 25 4
gpt4 key购买 nike

下面有一些示例源代码,其中包含 2 个锁定语句。在测试运行期间,我单击“r1RefreshButton”将 showReport1 方法放入永久循环中。然后我单击“r2RefereshButton”来检查锁定是否按预期执行。

我发现showReport2上的锁并没有真正锁定。我错过了什么?

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();
}
}

编辑:我从 C# Locking from events 找到了类似的主题

最佳答案

两个函数都在同一个线程上运行。锁是在线程级别持有的。

因此在 GUI 线程上运行的所有代码都“拥有”锁。

在此处了解更多信息:http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

关于c# - lock 语句未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com