C#Windows窗体应用程序:在加载窗体后如何在后台执行某些操作?

时间:2013-06-07 13:29:41

标签: c# winforms

在我的Windows窗体应用程序中,我成功运行了表单:

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

有效。我已加载表单。

但是如果我在加载表单后在一个循环中执行某些操作,请说...

String MyLog = Directory.GetCurrentDirectory() + "\\MyLog.txt";

while (true)
{
                using (StreamWriter writer = new StreamWriter(MyLog, true))
                {
                    writer.Write("Hello");
                }
                Thread.Sleep(1000);
}

......表格正在关闭/崩溃。

我试图在表单的Load属性中指定一个特殊的事件处理程序,但它没有帮助:

这段代码可以工作(我写了一个字符串“Hello”并且表单是活的):

private void formLoad(object sender, EventArgs e)
    {
          String MyLog = Directory.GetCurrentDirectory() + "\\MyLog.txt";


                    using (StreamWriter writer = new StreamWriter(MyLog, true))
                    {
                        writer.Write("Hello");
                    }
                    Thread.Sleep(1000);

    }

这段代码不起作用(我添加了一个循环) - 表单崩溃了:

   private void formLoad(object sender, EventArgs e)
    {
          String MyLog = Directory.GetCurrentDirectory() + "\\MyLog.txt";

          while (true)
          {
                    using (StreamWriter writer = new StreamWriter(MyLog, true))
                    {
                        writer.Write("Hello");
                    }
                    Thread.Sleep(1000);
          }

    }

我的问题是我如何组织代码以便在加载表单后可以在后台执行某些操作?

2 个答案:

答案 0 :(得分:3)

如果您想要执行此类操作,可以使用BackgroundWorker。但是你需要知道一些事情。首先,要设置它,你需要一个private类变量,你需要在构造函数中放入一些代码:

private BackgroundWorker _worker = new BackgroundWorker();

::ctor
{
    _worker.DoWork += DoBackgroundWork;

    // we set this so you can cancel softly if necessary
    _worker.WorkerSupportsCancellation = true;
}

然后你需要定义DoWork处理程序:

private void DoBackgroundWork(object sender, DoWorkEventArgs e)
{
    String MyLog = Directory.GetCurrentDirectory() + "\\MyLog.txt";

    while (!_worker.CancellationPending)
    {
        using (StreamWriter writer = new StreamWriter(MyLog, true))
        {
            writer.Write("Hello");
        }
        Thread.Sleep(1000);
    }
}

并注意我已检查CancellationPending属性以确保我们在必要时正常退出。稍后,如果您需要(例如,当您关闭表单时),请调用:

_worker.CancelAsync();

将其关闭。

最后,要启动它,请调用:

_worker.RunWorkerAsync();

答案 1 :(得分:2)

查看专门设计的BackgroundWorker组件,以便您在后台工作并向UI报告进度/更改。

请注意,您还通过调用Thread.Sleep(1000)来暂停UI线程,这可能不会很好地结束。

您可以在此处找到有关后台工作人员的文档 - http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx