Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BackgroundWorker忙时禁用表单?_C#_Backgroundworker - Fatal编程技术网

C# BackgroundWorker忙时禁用表单?

C# BackgroundWorker忙时禁用表单?,c#,backgroundworker,C#,Backgroundworker,我不希望用户在某个backgroundworker忙碌(工作)时与我的应用程序交互。我创建了这个bgw,这样应用程序在工作时看起来就不会冻结。但现在用户可以在应用程序中四处移动。如何禁用我的表单/应用程序 谢谢 是否可以将启用设置为错误 this.Enabled = false; 但这有点极端,因为它还可以防止窗体被移动、调整大小或关闭事件。更好的方法是在表单中放置一个面板控件,该控件具有Dock=Fill,并将其他控件放入该面板。然后您可以使用面板的Enabled属性来阻止进一步的用户输入

我不希望用户在某个backgroundworker忙碌(工作)时与我的应用程序交互。我创建了这个bgw,这样应用程序在工作时看起来就不会冻结。但现在用户可以在应用程序中四处移动。如何禁用我的表单/应用程序


谢谢

是否可以将
启用设置为
错误

this.Enabled = false;
但这有点极端,因为它还可以防止窗体被移动、调整大小或关闭事件。更好的方法是在表单中放置一个
面板
控件,该控件具有
Dock=Fill
,并将其他控件放入该
面板
。然后您可以使用
面板的
Enabled
属性来阻止进一步的用户输入


请注意,我认为用户将能够关闭表单,因此应该以某种方式优雅地进行处理。

另一种可能的方式是“过滤”应用程序的所有输入。 这可以通过听“按键”和“鼠标按钮”来实现。 触发后台作业后,您可以将FILTER_输入标志设置为true,并在完成后将其重置。 如果设置了FILTER_输入标志,则可以取消所有按键和鼠标事件


这可能不是最有效的,因为所有的按键和点击都将通过过滤器检查。

我同意@michael todd在上面的评论,在后台工作人员工作时禁用单个控件/导航按钮等似乎是一个相当好的解决方案。这将使您能够细粒度地控制用户在特定后台操作期间可以做什么

你可以:

  • 创建方法以启用或禁用所有适当的导航/交互控件(根据每个控件的情况,将其Enabled属性设置为true/false等)
  • 在后台工作程序上调用startRokerAsync()之前,从代码中调用“Disable”方法
  • 在RunWorkerCompleted的事件处理程序中,调用“Enable”方法重新启用视图以供用户输入

  • 您还可以创建一个模式“busy splash”对话框,该对话框在后台任务启动时显示,在任务结束时以编程方式删除。你也可以在盒子里放一点动画,让用户知道正在发生什么。您还需要确保他们不会手动关闭对话框(只允许以编程方式关闭对话框)。

    将某些控件放置在面板内并禁用该面板,而不是禁用单个控件,这样更容易管理禁用某些控件:

    controlPanel.Enabled = false;
    
    阻止其他任务(可能满足您的需要)的一种常见方法是显示最顶端的表单和进度条。我在过去成功地实现了这一点。其他程序也做同样的事情。例如,在WinRAR中,当应用程序忙于提取或压缩文件时,应用程序将显示最顶层的表单。它看起来像一个“模态”表单,但实际上,您仍然可以单击其他函数,WinRAR会询问“是否要中止当前操作?”


    禁用整个应用程序通常不是必需的,也可能不是直观的。所以,问问自己是否真的需要阻止与表单的交互。例如,我有一个应用程序,它需要一些时间来完成某些任务。我为特定的工作提供了一个进度条指示器,但是您仍然可以与应用程序交互以启动同时运行的其他任务。即使我只允许您一次执行一个任务,您也可能希望在任务运行时查看帮助文件或设置应用程序首选项。此外,我给用户一个按钮,允许他们停止任务。禁用表单将阻止这种类型的交互。

    如果在将代码移动到后台时禁用表单,将其移动到后台有什么意义?因为如果没有backgroundworker,Windows会说应用程序“没有响应”如果用户试图与它交互。这是一种快速而肮脏的方式,但它可能比禁用表单上用户可以交互的每个控件更好(取决于您的情况)。@Michael:禁用表单确实是快速而肮脏的:o)谢谢,我做了一些类似于迈克尔建议的事情。也是弗雷德里克对他最初答案的补充。。。谢谢使用此选项,我无法将鼠标光标更改为光标。WaitCursor:(这可能是一个很好的技巧,尤其是当您希望主窗体保持可见和不变时。您甚至可以使用非常小或隐藏的DialogForm。我做的另一件事是将窗体中的所有内容都包含在面板中,然后隐藏面板并放置一个“忙碌”对话框这样就无法与底层控件交互。