C#Winform多线程序列

时间:2011-04-05 23:06:42

标签: c# winforms multithreading

对于C#和编码来说相对较新。我正在尝试编写一个具有某种逻辑的程序,并且还指示了进度条的进度。我在Main()中启动了一个完成所有业务逻辑的线程。它有一些事件在我需要进度条的地方被扼杀。

Form对象订阅业务逻辑事件,并具有线程安全委托,可以调用它们来更新进度条和文本标签。

我的问题是,当Form在主线程中启动时,我必须在Application.Run()之前启动业务逻辑线程。当第一个ProgressUpdate事件被trigerred时,Form对象仍然不存在。我想一个hacky方法是在第二个线程中添加Thread.Sleep(100),但我不喜欢这样。我该如何解决这个问题?我是在完全错误的轨道上吗? (我甚至有意义吗?)

        Form1 theForm = new Form1();
        CreateReport theCreateReport = new CreateReport();
        Thread t = new Thread(new ThreadStart(theCreateReport.DoProcess));
        t.IsBackground = true;
        theForm.Subscribe(theCreateReport);
        t.Start();
        Application.Run(theForm);

theForm就是形式。 theCreateReport是我的业务逻辑开始的地方。

5 个答案:

答案 0 :(得分:4)

您希望使用一个或多个BackgroundWorker对象而不是业务逻辑线程。这将为您管理线程,并为您提供一种向主线程提供进度反馈的方法。

答案 1 :(得分:1)

也许您应该在OnLoad事件中启动业务逻辑?

答案 2 :(得分:0)

在您调用构造函数(在第一行)之后,Form已经存在 - 它还没有显示。所以你不必担心,当你启动新线程时,所有内容都会被初始化。

答案 3 :(得分:0)

Main中,只需创建表单并Application.Run即可。在表单的Load事件中,启动您的主题。

通过按照目前的方式做事,你并没有获得任何好处。正如您已经发现的那样,它会产生时间/序列问题。

解决问题的最佳方法是首先没有问题。

答案 4 :(得分:0)

我会使用BackgroundWorker,你仍然可以使用你的事件和代理。这一次你将结束并解雇Background Worker的“ProgressChanged”和“RunWorkerCompleted”事件。

表单可以监听这些事件并相应地更新ProgressBar。

BWorker更好地处理切换到GUI线程和异常处理。

您可以在表单加载时初始化BackgroundWorker。