1

我在 Visual Studio 2008 框架 3.5 中有一个 Windows 应用程序,我需要并发等待窗口,其中一个进程正在一个窗口中进行,并且在该窗口上出现另一个表单,其中包含一些移动图像(动画),就像 .gif 图像一样。

我有 2 个表单,在 form2 上,单击按钮我执行了一个漫长的过程,我希望我的“frmWait”出现在屏幕上,而 form2 上的过程正在进行并在完成时消失。当我的“frmWait”出现时,用户应该无法访问表单 2。

我的代码在这里。表格 2

在SomeWork过程中有一个我写过的for循环,但实际上在程序中它是在sqlserver中执行的数据库命令,当查询在服务器上执行时,我的主程序工作暂停,直到服务器完成工作,然后程序获得执​​行指针,同时,软件好像被挂了。

    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                frmWait fw = new frmWait("Wait...",0);
                fw.Show();

                SomeWork();

                fw.Close();
            }

            private void SomeWork()
            {
                for (int x = 0; x < 99999999; x++)
                { }
            }
        }
    }
4

6 回答 6

3

先加..

using System.Threading;

我已经修改了您上面的代码以使用单独的线程..

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SomeWork();             
}

Thread t;

private void SomeWork()
{
    frmWait fw = new frmWait("Wait...", 0);

    this.t = new Thread((ThreadStart)delegate()
    {

        for (int x = 0; x < 99999; x++)
        {
            Thread.Sleep(100);

            //Debug.WriteLine(x);
        }


        if (this != null && !this.IsDisposed) this.BeginInvoke((ThreadStart)delegate() { fw.Close(); });
    });

    this.t.Start();

    fw.ShowDialog(this);
}

如果允许用户在完成之前关闭 Form2,您可能还想处理 FormClosing 事件以终止线程!

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (t != null && t.IsAlive) t.Abort();
} 
于 2012-04-25T03:44:01.630 回答
3

您应该在后台线程中执行冗长的过程。这可以使用BackgroundWorker轻松实现。

一旦工作人员启动,只需使用显示 frmWait 即可frmWait.ShowDialog()

当工作人员通知工作结束时,关闭 frmWait 例如使用frmWait.DialogResult=Cancel.

您可以利用该ProgressChanged事件在您的 frmWait 中报告进度。

如果用户单击 frmWait 中的取消按钮,只需调用CancelAsync()您的后台工作人员。

完整样本在这里

于 2012-01-20T06:42:03.963 回答
2

.NET 4 引入了任务并行库,使这样的任务更容易。您应该使用System.Threading.Tasks.Task而不是使用 BackgroundWorker 。此问题的答案中有更多信息:BackgroundWorker 的任务并行库替换?

于 2012-01-20T07:09:57.463 回答
0

在这种情况下,您应该使用BackgroundWorkerSomeWork部分从主 UI 线程移开

SomeWork();部件移动到单独DoWork的方法中BackgroundWorker。这种方式SomeWorkBackgroundWorker在一个单独的后台线程中执行。然后在完成Background Work Completed后将引发的事件SomeWorkfw.Close();

于 2012-01-20T06:42:26.280 回答
-1

您可以使用模态拨号框。因为它不允许与其他表单交互(即 form2)

frmWait.ShowDialog();

也尝试使用 Backgroud worker background worker,这使得做后台进程更容易。

于 2012-01-20T06:42:06.410 回答
-1

我不明白你的确切意思,但如果你想要在打开frmWait之前,你的Form2一定不能被用户访问,使用frmWait.ShowDialog(),如果你想在特定进程结束时关闭frmWait,在 frmWait 中,使用以下

Process.WaitForExit();
this.Close();
于 2012-01-20T06:48:23.197 回答