gpt4 book ai didi

c# - 立即中止异步任务c#

转载 作者:行者123 更新时间:2023-12-03 13:16:46 25 4
gpt4 key购买 nike

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

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

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

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

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

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

EDIT2:我认为这不是一个好主意,但是创建一个新进程并使用 Process.kill() 怎么样? ?

最佳答案

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

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

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

- 开始

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

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

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

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

- 停止

如果要停止操作,只需使用在 Start 中初始化的 CancellationTokenSource。方法,并将调用 cts.Cancel()
有关处理 CancellationTokens 的更多信息,您可以在文档或此 SO question 中找到

还要检查:

  • https://docs.microsoft.com/en-us/dotnet/standard/threading/managed-threading-basics
  • https://docs.microsoft.com/en-us/dotnet/standard/threading/cancellation-in-managed-threads
  • 关于c# - 立即中止异步任务c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61949213/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com