.net – 使用WinForms进行MVP异步调用的最佳实践

我在WinForms项目中使用了Model-View-Presenter模式,并且我遇到的一个问题是当表单告诉演示者做某事然后在演示者去做时没有反应时.幸运的是,在我的项目中,我使所有的presenter调用异步都没有问题,问题是如何做到这一点?

每个演示者调用是否应该包含在新的线程创建中?*

new Thread(()=>_presenter.DoSomething()).Start();

什么是最好的做法?如果用户按下“中止您正在做的事情”按钮怎么办?我该如何优雅地流产?

.*实际上我可能只是在演示者上使用某种代理来执行此操作而不是将线程创建放在WinForm中

最佳答案
我只能声称我已经考虑过这个问题(先阅读你的问题;).首先,我要在那些真正重要的地方进行钻探;例如DB访问阻塞点.如果有一个不应该在“UI”上下文中执行的地方(你可以将它从http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.current.aspx保存在UI线程中,然后再比较到非UI同步上下文),那么Debug.BitchAndMoan()就可以了.任何更长的计算(“应该”在它们自己的流形中都应该清楚地分开,正确;)应该断言.

我想你至少应该通过属性配置presenter函数的执行类型,然后由代理服从. (以防你想要以连续方式完成某些事情).

取消任务实际上是演示者的问题,但您必须有一个引用对象来告诉您要停止的内容.如果你采用代理方式,那么你可以使用IAsyncResult将已创建的线程提取到任务列表中,但如果允许同时多次并行调用相同的操作,则决定哪一个应该被取消仍然是个问题.因此,您必须在启动时为任务提供适当的特定于呼叫的名称;这意味着View方面的逻辑过多 – >演示者可能应该要求View询问用户应该处理哪个任务.

我的经验是,这通常只是通过使用事件(SCSF风格)来解决.如果从头开始,我会采用代理方式,因为SCSF在很多方面都很痛苦,我怀疑它的设计师的理智.

转载注明原文:.net – 使用WinForms进行MVP异步调用的最佳实践 - 代码日志