这可能是一个非常普遍的问题 - 但我对C#很新。 你可以向我解释一下这个问题,或者给我一个例子或解释的良好链接。
我想设计一个C#Winform应用程序。 该应用程序有一个主窗体,可在需要时收集用户输入。 与UI一起开发了一种复杂的长期运行计算算法。 从主窗体上的按钮触发计算开始。 (CaculateClass.Start())
问题1: 在CaculateClass的方法调用堆栈深处的某个时间点,CaculateClass检测到它需要来自用户的进一步输入以继续计算。
在古老的C ++控制台应用程序时代,人们可能会做到这样的事情: cout<< “问问题”; cin>>回答;
如何在带有winforms的C#中完成此操作,将控制权从调用堆栈深处的某个位置传递给UI,获取输入并返回到计算中断的位置? 或者CaculateClass的设计方式有些完全不同?
问题2 为了避免冻结UI,许多文章建议将这种长时间运行的计算放入另一个线程中 - 例如使用BackgroundWorker()
如果我让背景工作者计算CaculateClass.Start() - >收集用户输入如何工作呢?
感谢您的帮助, CS
答案 0 :(得分:4)
如何在带有winforms的C#中完成此操作,将控制权从调用堆栈深处的某个位置传递给UI,获取输入并返回到计算中断的位置?或者CaculateClass的设计方式有些完全不同?
它可能不是特定于语言,但你想要解开东西。从表单中获取输入,例如在委派的类中对其进行操作。一旦您的委托类准备就绪并且要显示结果,您就可以更新UI。
问题2为避免冻结UI,许多文章建议将这种长时间运行的计算放入另一个线程 - 例如使用BackgroundWorker()
至于响应性,是的,后台线程在那里可以正常工作。收集输入没有区别,您只需将输入传递给对象,该对象就会为您计算内容。在同一个线程或不同的线程上进行设计选择是一个问题。将结果发布回主线程时会出现差异。由于您不应该(不能)在主线程之外的另一个线程上更改用户控件,因此您需要将Invoke
结果返回到主线程。更多关于this topic can be found on MSDN。
关于一般性问题的一般性评论:)
尽量保持UI内容尽可能薄。它负责可视化事物并获得用户输入。 Google for MVC(模型视图控制器) - 众所周知的GUI设计模式。或者看看MVVM(模型视图视图模型) - 一种更现代的GUI设计模式。两者都有很多最佳实践和方法可以使您的设计脱钩。
答案 1 :(得分:3)
您应该查看续订任务:http://msdn.microsoft.com/en-us/library/ee372288.aspx
任务是执行后台工作的新编程范例,它们优先于BackgroundWorker。