.Net无响应,Application.DoEvents和线程

时间:2009-03-08 01:22:27

标签: vb.net multithreading

我的mdi VB.Net应用程序对某些数据执行长时间操作。理想情况下,我应该使用一个单独的线程来防止可怕的“无响应”消息。

我的问题是,如果我使用单独的线程用户,则可以单击应用程序中的其他控件,这些控件可以直接影响我的后台线程正在处理的操作,从而产生错误。

有没有办法阻止所有mdi窗口,工具栏和其他控件在我的后台线程操作期间接收鼠标点击和键盘输入?

或者有没有办法在执行Application.DoEvents之前清除消息队列?

由于

5 个答案:

答案 0 :(得分:4)

我想说当你不想让用户点击某个控件时,最好的选择就是为该控件设置Enabled为False。

澄清:为父控件设置Enabled为False也会禁用所有子项。因此,在主窗口和MDI窗口上将Enabled设置为False将会起到作用。

答案 1 :(得分:2)

有几种方法可以禁用控件,但我不确定这是你想要的。

如果你有一个主窗口在后台线程正在处理时被完全禁用,那么为什么要经历后台处理的开销呢?在后台处理的优点是允许用户在处理数据时仍然使用应用程序。

我认为更好的方法是采用Dustin的路线并有选择地禁用可能影响后台操作的某些控件。或者在处理过程中使您的后台操作独立于UI。

如果您告诉我们关于主窗口和后台线程如何交互的更多信息,我们可以为您提供更好的解决方案。

答案 2 :(得分:0)

隐藏所有表单,仅显示一个主表单。然后禁用工具栏/菜单(如果有)。然后有一个带有进度条的状态栏,当它完成后,取消隐藏用户正在处理的表单。

答案 3 :(得分:0)

当您的后台线程处理某个长期任务时使用状态栏或进度条时,禁用表单也会禁用您的进度/状态栏进行更新。所以在这种情况下你应该做的就是禁用每个需要保持活动状态的其他控件(例如像进度条)。

List<Control> lstControls = GetAllControls(this.Controls);

                foreach (Control ctrl in lstControls)
                {
                if (ctrl.GetType().Name.ToLower().Contains("progressbar")                     {
                        ctrl.Enabled = true;
                    }
                    else
                    {
                        ctrl.Enabled = false;
                    }
                }

答案 4 :(得分:0)

使用线程并显示一个模式对话框,向用户显示任务进度,并为用户提供取消任务的选项。

模态对话框将自动阻止输入(父级可能必须是mdi窗口本身。)

(请不要使用像隐藏或禁用控件或窗口之类的黑客。请拜托,请!请不要使用DoEvents。)