对于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是我的业务逻辑开始的地方。
答案 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。