Windows窗体中的线程
我多年来一直在编写ASP.NET Web应用程序,但还没有真正处理大型Windows窗体项目。 我现在需要处理一个,所以我正在寻找关于如何理想地构建大型Windows窗体项目的一些指示。 更具体地说,我想知道如何处理多个线程。 假设您有一个需要一些时间才能完成的过程 – 您不希望ui窗口被冻结且没有响应。 所以逻辑需要在一个单独的线程中移动。 如果此线程访问UI,则会导致exception。 Invoke似乎可以解决这个问题,但看起来非常难看并且阅读起来很麻烦!
那么,实际上,最佳实践是什么? 应该启动什么类型的线程,以及如何在UI和逻辑之间拆分这些线程? 任何示例代码开始?
这是使用backgroundworker的简短方法
public Form1() { InitializeComponent(); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; //set to true to fire the progress-changed event worker.DoWork += doWork; worker.ProgressChanged += progressChanged; } void progressChanged(object sender, ProgressChangedEventArgs e) { int progress = e.ProgressPercentage; //Progress-Value object userState = e.UserState; //can be used to pass values to the progress-changed-event } void doWork(object sender, DoWorkEventArgs e) { object argument = e.Argument; //Parameters for the call bool cancel = e.Cancel; //Boolean-Value for cancel work object result = e.Result; //Object for a return-value }
只要您使用其他线程,就必须在触摸UI时切换回UI线程。
someForm.BeginInvoke()可以做到这一点但有更多选项。
BackgroundWorker可以为您进行切换。
在.NET 4.5 / C#5中,您可以使用async / await ; 将在原始线程上调用continuation。
通常,尝试从UI中尽可能多地解开逻辑,这样您就不需要经常切换线程。
有很多方法可以实现UI响应,执行长时间运行的任务,实现并行性。 您必须为您的应用选择正确的方法 –
Jon Skeet 撰写的这篇文章始终是一个奖励。
-
您可以根据应用程序设计和要求使用任何这些样式异步调用同步方法
-
更困难的情况 ,例如协调多个线程的工作,或处理阻塞的线程
-
有许多方法可以向客户端代码公开异步function。 在此处阅读基于事件的异步模式 – 它规定了类提供异步行为的推荐方法。
-
当你有一个长时间运行的任务时, 后台工作人员会派上用场。
希望这能为您提供一个良好的开端。