我在主窗体上显示对话框,现在一个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();
}
现在我遇到的问题是,显示进度的对话框不像对话框那样,并且可以访问主窗体,如果我们尝试访问主窗体,则对话框会隐藏。而且我不想隐藏对话框。
答案 0 :(得分:1)
您可以让其他thread处理循环。
对编辑的回应:您能否提供更多细节,或许是一些代码?循环在做什么?你用什么形式展示?
答案 1 :(得分:1)
(这个答案基于我们正在考虑使用winforms应用程序的假设)
使用Show
方法展示表单,而不是ShowDialog
。通过将引用传递给主窗体,即使它不是模态,对话框也将保持在主窗体的顶部:
TheDialog dialog = new TheDialog();
dialog.Show(this);
请注意,用户仍然可以与主窗体上的控件进行交互,因此您可能需要禁用某些控件,具体取决于您的方案。
您在问题中声明存在阻止您使用线程的要求。这种要求让我觉得很奇怪,很遗憾,因为这是你想要使用某种异步构造的典型场景之一。通过在UI线程上执行繁重的工作,您会遇到一些缺点,包括:
答案 2 :(得分:0)
请勿使用ShowDialog()
,而是使用Show()
来显示对话框窗口。 Show()
将立即返回调用者,而ShowDialog()
将保持执行。请注意,使用Show()
时,对话框将不再是模态的。
答案 3 :(得分:0)
好的,所以你不需要模态对话框,你需要一种机制让你的用户在启用处理时不能选择你的主表单。
模态对话框并不意味着停止执行 - 它只是发生在其他地方。
有几种方法可以做到这一点,你排除了新的线程创建(不知道为什么,它会优雅地解决它)。如果不使用线程,你会遇到另一个问题 - 你的处理应该在CHUNKS中完成,你必须做一些像Application.DoEvents()
这样的事情,以使你的应用程序能够处理消息,而不是冻结到用户。
所以,如果您可以在主窗体中创建一个方法,显示您的“请稍候”对话框,该对话框将执行一些工作,之后再做一些工作直到完成,您可以这样做:
ShowDialog()
表格你能这样做吗?
反正:
PICK 2.你不能在Winforms中拥有全部3个。