Dialog停止执行代码,是否可以在c#中停止它?

时间:2010-10-21 09:38:05

标签: c# .net modal-dialog

我在主窗体上显示对话框,现在一个for循环正在后面工作但是当该对话框显示时代码执行将被停止,但我不想让代码执行停止,是任何其他的这样做的方法?

编辑:我现在正在使用线程来做到这一点,我的代码就像

    Thread t;
    private void StartParsingByLoop()
    {
       t = new Thread(new ThreadStart(RunProgress));
       t.Start();
       for (int i = 0; i < dialog.FileNames.Length; i++)
       {
          cNoteToParsed.AllContrctNotesFilePath.Add(dialog.FileNames[i].ToString());
       }
          cNoteToParsed.ParseContractNote();
          if (cNoteToParsed.NOfContrctNoteParsed > 0)
                LoadTransactionsInDataGridView();
          t.Abort();
    }

    private void RunProgress()
    {
        frmProgress progressForImportingTran = new frmProgress("Importing Transactions", "ok");
        progressForImportingTran.ShowDialog();
    }

现在我遇到的问题是,显示进度的对话框不像对话框那样,并且可以访问主窗体,如果我们尝试访问主窗体,则对话框会隐藏。而且我不想隐藏对话框。

4 个答案:

答案 0 :(得分:1)

您可以让其他thread处理循环。

对编辑的回应:您能否提供更多细节,或许是一些代码?循环在做什么?你用什么形式展示?

答案 1 :(得分:1)

(这个答案基于我们正在考虑使用winforms应用程序的假设)

使用Show方法展示表单,而不是ShowDialog。通过将引用传递给主窗体,即使它不是模态,对话框也将保持在主窗体的顶部:

TheDialog dialog = new TheDialog();
dialog.Show(this);

请注意,用户仍然可以与主窗体上的控件进行交互,因此您可能需要禁用某些控件,具体取决于您的方案。

您在问题中声明存在阻止您使用线程的要求。这种要求让我觉得很奇怪,很遗憾,因为这是你想要使用某种异步构造的典型场景之一。通过在UI线程上执行繁重的工作,您会遇到一些缺点,包括:

  • 用户界面无法响应 - 如果您希望允许用户通过点击按钮取消工作,那么以强大的方式实现这一目标将非常棘手。
  • 由于UI线程忙于执行其他工作,因此用户界面无法正确重绘

答案 2 :(得分:0)

请勿使用ShowDialog(),而是使用Show()来显示对话框窗口。 Show()将立即返回调用者,而ShowDialog()将保持执行。请注意,使用Show()时,对话框将不再是模态的。

答案 3 :(得分:0)

好的,所以你不需要模态对话框,你需要一种机制让你的用户在启用处理时不能选择你的主表单。

模态对话框并不意味着停止执行 - 它只是发生在其他地方。

有几种方法可以做到这一点,你排除了新的线程创建(不知道为什么,它会优雅地解决它)。如果不使用线程,你会遇到另一个问题 - 你的处理应该在CHUNKS中完成,你必须做一些像Application.DoEvents()这样的事情,以使你的应用程序能够处理消息,而不是冻结到用户。

所以,如果您可以在主窗体中创建一个方法,显示您的“请稍候”对话框,该对话框将执行一些工作,之后再做一些工作直到完成,您可以这样做:

  • 创建新表单(等待对话框)
  • 在其中启动计时器并将计时器连接到PARENT表单
  • 计时器间隔应为1
  • ShowDialog()表格
  • 关于计时器事件做少量工作(不要让它超过1/10秒)

你能这样做吗?

反正:

  • 任务不能分成小的可行的部分
  • 你不能使用线程
  • 您希望自己的用户界面具有响应能力

PICK 2.你不能在Winforms中拥有全部3个。