1

在我的 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);
          }

    }

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

4

2 回答 2

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();
于 2013-06-07T13:38:53.067 回答
2

查看BackgroundWorker专门设计用于允许您在后台工作并向 UI 报告进度/更改的组件。

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

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

于 2013-06-07T13:33:39.033 回答