如何取消需要在服务器端启动(而不是由客户端发起)的长时间运行的操作
本文关键字:客户端 长时间 操作 运行 启动 取消 何取消 服务器端 | 更新日期: 2023-09-27 18:12:07
我有一个类,它根据在对象状态改变之前引发事件和在状态改变后引发事件的惯例公开可取消事件。发布者(服务器)公开的更改前事件在表单StateChanging
上,并具有作为参数的CancelEventArgs
,而更改后事件在表单StateChanged
上。这为事件的订阅者(客户端)提供了在操作开始之前取消操作的能力。
现在我已经更改了其中一个操作,使其成为一个长时间运行的操作,并且我希望为订阅者提供在操作开始后取消操作的可能性(并且还可以知道操作的进度)。我想到了基于事件的异步模式。
问题是我想保留更改前和更改后的事件模式,因为在某些时候需要操作的是发布者,而在异步模式中,在我看来,是客户端专门要求异步运行某个操作。另一种可能性(但对我来说似乎并不优雅)可能是让服务器公开一个事件(例如OperationRequired
),该事件允许客户端知道需要在服务器端完成什么,并相应地调用RunOperationAsync()
方法。
基于事件的异步模式通常适用于由UI控制的操作。另一种选择,即异步编程模型,通常是服务器或库api的首选。如果您选择了实现EAP,那很好。
看一下BackgroundWorker的实现——它是EAP支持取消的最好例子。它通过标准CancelAsync()
方法提供取消。