4

这可能是一个非常普遍的问题 - 但我对 C# 很陌生。您能否向我解释一下,或者给我一个很好的示例或解释链接。

我想设计一个 C# Winform 应用程序。该应用程序有一个主窗体,它在需要时收集用户输入。与 UI 一起开发了一个复杂的长时间运行的计算算法。计算的开始是从主窗体上的按钮触发的。(CaculateClass.Start())

问题 1: 在 CaculateClass 的方法调用堆栈深处的某个时间点,CaculateClass 检测到它需要用户进一步输入才能继续计算。

在古老的 C++ 控制台应用程序时代,人们会做这样的事情: cout << "Ask question"; cin >> 回答;

这是如何在 C# 中使用 winforms 完成的,从调用堆栈深处的某处将控制权传递给 UI,获取输入并返回计算中断的地方?还是 CaculateClass 的设计方式完全不同?

问题 2 为避免 UI 冻结,许多文章建议将如此长时间运行的计算放入另一个线程 - 例如使用 BackgroundWorker()

如果我让 BackgroundWorker 计算 CaculateClass.Start() -> 那么收集用户输入如何工作?

感谢您的帮助,CS

4

2 回答 2

4

这是如何在 C# 中使用 winforms 完成的,从调用堆栈深处的某处将控制权传递给 UI,获取输入并返回计算中断的地方?还是 CaculateClass 的设计方式完全不同?

它可能不是特定于语言的,但您希望将事物解耦。从表单中获取您的输入,例如在委托类中对其进行操作。一旦您的委派课程准备就绪并显示结果,您就可以更新您的 UI。

问题 2 为避免 UI 冻结,许多文章建议将如此长时间运行的计算放入另一个线程 - 例如使用 BackgroundWorker()

至于响应能力,是的,后台线程在那里可以正常工作。收集输入没有什么不同,您只需将输入传递给一个对象,该对象就会为您计算东西。在同一线程或不同线程上执行此操作是设计选择的问题。将结果发布回主线程时会有所不同。由于您不应该(不能)在主线程之外的另一个线程上更改用户控件,因此您需要Invoke将结果返回到主线程。可以在 MSDN 上找到有关此主题的更多信息。

关于一般问题的一般评论:)

尽量保持 UI 的东西尽可能薄。它负责可视化事物并获取用户输入。Google for MVC(模型视图控制器)——众所周知的 GUI 设计模式。或者看看MVVM(模型视图视图模型)——一种更现代的 GUI 设计模式。两者都有很多最佳实践和方法来保持您的设计解耦。

于 2013-04-01T19:20:54.503 回答
3

你应该看看继续任务:http: //msdn.microsoft.com/en-us/library/ee372288.aspx

任务是执行后台工作的新编程范例,它们优于 BackgroundWorker。

于 2013-04-01T19:18:44.367 回答