繁体   English   中英

如何取消需要在服务器端启动(而不是由客户端启动)的长时间运行的操作

[英]How to cancel long-running operations that require to start on the server side (rather than initiated by the client)

我有一个类,它根据在对象状态改变之前引发事件和在状态改变之后引发事件的约定公开可取消的事件。 由发布者(服务器)公开的变更前事件形式为StateChanging并具有一个CancelEventArgs作为参数,而变更后事件形式为StateChanged 这为事件的订户(客户端)提供了在操作开始之前取消操作的功能。

现在,我已经更改了其中一项操作,使其成为一项长期运行的操作,并且我希望使订户有可能在操作开始后也可以取消该操作(并知道操作进度)。 我想到了基于事件的异步模式

问题是我想保留更改前和更改后事件模式,因为在某些时候是发布者需要操作,而在异步模式中,我似乎是客户端专门询问了某个事件。操作将异步运行。 另一种可能性(但对我而言似乎并不优雅)可能是让服务器公开一个事件(例如OperationRequired ),该事件使客户端可以知道在服务器端需要完成的操作并相应地调用RunOperationAsync()方法。 请发表评论并添加您的建议。

对于由UI控制的操作,通常首选基于事件的异步模式。 对于服务器或库API,通常首选替代方案“异步编程模型”。 如果您选择实施EAP,那很好。

看一下BackgroundWorker的实现-这是支持取消等功能的EAP的最佳示例。 它通过标准的CancelAsync()方法提供取消功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM