2012-03-14 46 views
0

下面的动作的情景:
平台:视窗
IDE:微软的Visual Studio 2008
语言:C#
.NET框架:3.5

我的应用程序包含2 buttons - “加载数据”和“停止加载数据”和multi-line textbox。点击“加载数据”button后,一些数据开始在textbox中加载。为了防止用户多次单击“加载数据”button,我已经在点击后禁用了button。当整个数据在textbox中加载时,“加载数据”button再次被激活。另一方面,当点击“停止加载数据”button时,停止加载数据(如果用户希望在加载整个内容之前停止它)。如前所述,为防止用户多次点击“加载数据”button,我已禁用button,意图用户只能点击“停止加载数据”button或等待整个数据为载入textbox。我实现了这一点。乍一看它似乎运作良好。但在测试过程中,我发现即使“加载数据”button已禁用,如果用户单击了button,虽然此时没有任何事情发生,但只要整个数据加载并且button再次启用,该点击就会生效发现在禁用状态期间被执行。就好像程序正在记录击键和鼠标点击并等待按钮再次变为活动状态。但是我的程序中没有这种按键或鼠标点击记录功能。什么导致了这样的活动?我怎样才能防止这种行为?

谢谢。防止用户点击一个特定的按钮时,正在执行

+2

你是否因为不使用后台线程来执行操作而阻止了用户界面? – Matthias 2012-03-14 14:47:50

+0

@ winSharp93:我正在使用后台线程来执行操作。但我仍然遇到了一些问题。感谢Yahia,因为建议的解决方案适合我。 – OutOfBoundsException 2012-03-14 15:08:51

回答

3

一种选择是使用重入定点工作:

你可以定义一个int场(0初始化),并通过Interlocked.Increment在进入方法更新它,才能继续进行,如果是1,在结束只是做一个Interlocked.Decrement

使其可见用户,你可以在开始执行时禁用按钮,并启用它,当执行结束了......

BTW:长时间运行的任务应该异步完成(通过单独的螺纹为例)...

+0

我真的很喜欢这个解决方案。另外,你也可以在你的业务中使用这种技术:)。 – squelos 2012-03-14 14:51:09

+0

@squelos对于多线程场景也是安全的:-) – Yahia 2012-03-14 14:52:24

+0

是的,那为什么我经常在我的业务中使用它。当你在一个线程中开始工作时,它几乎是一样的机制,并且不想在第一个工作完成之前启动另一个工作。 – squelos 2012-03-14 14:57:13

0

如果你把你的电话一个同步,它会锁定整个页面,直到加载完成。

否则你会只是做你已经尝试过的方法,我想看看你的残疾人状态代码,因为东西告诉我你使它看起来被禁用,它仍然是一个功能按钮

0

我敢打赌,你甚至不能移动窗体,直到数据加载,并且你也无法停止加载数据。问题是整个表单冻结,直到加载完成。您必须将加载部件移动到单独的线程中。

0

好了,再另silution:

在负载开始是隐藏load按钮代替它(说)显示一个进度条。在完成加载或在stop loading点击使load按钮再次可见。在这种情况下,您可以避免您抱怨的“连锁点击”管理。

或管理一个按钮。首先是load,点击后,变成stop load。考虑到有限的屏幕空间,您会在移动环境中经常发现这样的解决方案。但我认为它也可以应用于桌面,并取得巨大成功。为什么不?

相关问题