如何在C#WinForms应用程序中设计工作流程?

时间:2013-04-01 19:11:06

标签: c# winforms background workflow worker

这可能是一个非常普遍的问题 - 但我对C#很新。 你可以向我解释一下这个问题,或者给我一个例子或解释的良好链接。

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

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

在古老的C ++控制台应用程序时代,人们可能会做到这样的事情:     cout<< “问问题”;     cin>>回答;

如何在带有winforms的C#中完成此操作,将控制权从调用堆栈深处的某个位置传递给UI,获取输入并返回到计算中断的位置? 或者CaculateClass的设计方式有些完全不同?

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

如果我让背景工作者计算CaculateClass.Start() - >收集用户输入如何工作呢?

感谢您的帮助, CS

2 个答案:

答案 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。

相关问题