1

我正在为我的应用程序设计一个插件系统。

UI 中有一个“开始”按钮。当用户点击它时,应用程序应该异步调用插件 dll 中的一个方法,并将“开始”更改为“停止”。该方法可以包括几乎任何东西,就像插件一样。当用户单击“停止”时,该异步方法应立即终止

我想用Thread.Abort();,但大家建议不要用。如果我使用 CancellationTokenSource,我必须为所有插件添加取消处理,我不想这样做。

我需要一台 PC 的强制关机拔出销毁(如果需要!)之类的东西。对我来说唯一重要的是立即停止。不需要清理或类似的事情,因为我的应用程序在使用它后会卸载插件,并且插件与主应用程序代码无关。

反正没有异步启动一个方法并完全控制它吗?在这种情况下可以使用Thread.Abort();(如果我保证 dll 不会捕获线程中止异常)?

编辑:有没有办法在运行方法时异步主动监视插件dll(类)中的取消令牌,并在请求时杀死方法?

EDIT2:我认为这不是一个好主意,但是创建一个新流程和使用Process.kill()呢?

4

1 回答 1

4

不,恐怕您必须为取消令牌使用额外的参数。

避免使用线程,因为它们非常低级,并尝试使用任务的实用程序和抽象,这隐藏了很多麻烦。

编辑:您在回答和评论中提到要取消异步方法,但您也提到这不是任务。这让我很困惑。假设您有一个处理启动/停止代码的类。

- 开始

当您想开始插件的异步处理时,您必须创建一个new CancellationTokenSource(),并将其作为私有变量保存在控制 Start/Stop 的类中。

现在假设您现在有一个要异步运行的方法,并且它具有签名: public Task Run(string anyArgument)

您还应该添加另一个参数,使其变为: public Task Run(string anyArgument, CancellationToken token) 大多数公开异步方法的库也接受 CancellationToken 的可选参数。这背后的逻辑是,当您(从任何地方)想要取消该进程时,您请求令牌停止,如果它被选中,它将反过来停止任何异步操作。

说了这么多,我们去...

- 停止

如果要停止操作,只需使用在Start方法中初始化的 CancellationTokenSource,然后调用cts.Cancel()

有关处理 CancellationTokens 的更多信息,您可以在文档或此SO 问题中找到

还要检查:

于 2020-05-22T06:43:34.347 回答