【发布时间】:2011-06-21 10:09:35
【问题描述】:
可能重复:
How to block Winforms UI while background thread is running
我正在使用 C# WinForm 应用程序
我在屏幕上有一个保存按钮,屏幕数据保存到数据库。
当用户点击按钮应用程序进入数据库并保存数据时会发生什么。 这需要一些时间。
但是,如果用户再次单击“保存”按钮,则会捕获 Click 事件,并且当第一次单击返回主代码(保存数据库后)时,会触发捕获的事件..
简而言之,当线程从第一个事件返回时,点击事件被捕获并触发 (我尝试了启用/禁用按钮的场景)。
我怎样才能阻止这种行为。
问候, 阿基尔
@Jalal:我尝试了这段代码并做了一些修改
private readonly object _userActivityLocker = new object();
private void btnSave_Click(object sender, EventArgs e)
{
if (System.Threading.Monitor.TryEnter(_userActivityLocker))
{
//note that any sub clicks will be ignored while we are here
try
{
DateTime dt = DateTime.Now;
Thread.Sleep(2000);
Debug.Print("FirstClick {0} Second Click {1}",dt.ToLongTimeString(), DateTime.Now.ToLongTimeString());
//here it is safe to call the save and you can disable the btn
Application.DoEvents();
}
finally
{
System.Threading.Monitor.Exit(_userActivityLocker);
//re-enable the btn if you disable it.
}
}
}
但是当我快速点击按钮时(我检查了 5 次快速点击)5 个点击事件 已被触发并显示控制台窗口
第一次点击 1:30:22 PM 第二次点击 1:30:24 PM 第一次点击 1:30:24 PM 第二次点击 1:30:26 PM 第一次点击 1:30:26 PM 第二次点击 1:30:28 PM 第一次点击 1:30:28 PM 第二次点击 1:30:30 PM 第一次点击 1:30:30 PM 第二次点击 1:30:32 PM
【问题讨论】:
-
奇怪……应该可以的
-
@V4Vendetta:这预计会发生..有关更多信息,请参阅我的答案。
-
我忘记将代码包装在一个新线程中......我的错。但是我更新了答案。 ——
标签: c# winforms multithreading