以下是该情景:
平台:Windows
IDE:Microsoft Visual Studio 2008
语言:C#
.NET框架:3.5
我的应用程序包含2个buttons
- “加载数据”和“停止加载数据”以及multi-line textbox
。点击“加载数据”button
后,一些数据开始加载到textbox
。为防止用户多次点击“加载数据”button
,我点击了button
后再将其停用。当整个数据加载到textbox
中时,“加载数据”button
会再次被激活。另一方面,单击“停止加载数据”button
,停止加载数据(如果用户希望在加载整个内容之前停止加载)。
如前所述,为防止用户多次点击“加载数据”button
,我已禁用button
,意图用户只能点击“停止加载数据”{{1}或者等待整个数据加载到button
。我实现了这个。乍一看似乎效果很好。但是在测试时我发现尽管“加载数据”textbox
被禁用,但如果用户点击button
,虽然没有任何事情发生,但是一旦整个数据加载并且button
再次启用,发现在禁用状态期间发出的单击被执行。好像程序正在记录击键和鼠标点击并等待按钮再次变为活动状态。但是我的程序中没有这样的按键或鼠标点击记录功能。是什么导致了这样的活动?我该如何防止这种行为?
感谢。
答案 0 :(得分:3)
一种选择是使用重入哨兵:
您可以定义一个int
字段(初始化为0)并在输入方法时通过Interlocked.Increment
更新它,并且仅在它为1时才继续。最后只需执行Interlocked.Decrement
要使用户可以看到它,您可以在执行开始时禁用该按钮,并在执行完成时启用它...
顺便说一句:长时间运行的任务应该是异步的(例如通过一个单独的线程)......
答案 1 :(得分:0)
如果您将呼叫设为同步呼叫,它将锁定整个页面,直到加载完成。
否则你只是在做你已经尝试过的方法,我想看看你的禁用状态的代码,因为有些东西告诉我你刚刚让它看起来被禁用了,它仍然是一个功能按钮
答案 2 :(得分:0)
看看这篇文章:
http://www.codeguru.com/forum/showthread.php?t=480279
我的第一个想法是删除事件处理程序并在click事件结束时重新绑定它。该线程建议使用BackgroundWorker并使其异步。
答案 3 :(得分:0)
我敢打赌,在加载数据之前你甚至无法移动表单,也无法停止加载数据。问题是整个表单冻结直到加载完成。您必须在单独的线程中移动加载部件。
答案 4 :(得分:0)
嗯,又来了一次:
在开始加载时,只需隐藏load
按钮,代替它(比如说)显示进度条。加载完成后或在stop loading
点击后再次显示load
按钮。在这种情况下,您可以避免抱怨的“链接点击”管理。
或管理一个按钮。首先是load
,点击后,变为stop load
。考虑到有限的屏幕空间,您会经常在移动环境中找到这样的解决方案。但我认为它也可以应用于桌面,也很成功。为什么不呢?