立即中止异步任务 c#
Immediately abort an asynchronous task c#
我正在为我的应用程序设计一个插件系统。
UI 中有一个 "Start" 按钮。当用户点击它时,应用程序应该异步调用插件dll中的方法并将"Start"更改为"Stop"。该方法几乎可以包括任何插件。当用户单击 "Stop" 时,该异步方法应立即终止 。
我想用Thread.Abort();
但是大家都建议不要用。如果我使用 CancellationTokenSource,我必须向所有插件添加取消处理,我不想这样做。
我需要类似强制关机、拔出或销毁(如果需要的话! ) 用于 PC。对我来说唯一重要的是立即停止。不需要清理或类似的事情,因为我的应用程序在使用后卸载插件并且插件与主要应用程序代码无关。
有没有办法异步启动一个方法并对其进行完全控制?在这种情况下使用 Thread.Abort();
是否可以(如果我保证 dll 不会捕获线程中止异常)?
编辑: 有什么方法可以在请求时异步主动监视插件 dll (class) 中的取消令牌,同时 运行 方法和 kill 方法?
EDIT2: 我认为这不是一个好主意,但是创建一个新进程并使用 Process.kill()
怎么样?
不,恐怕您必须为取消标记使用额外的参数。
避免使用线程,因为它们非常低级,并尝试使用任务的实用程序和抽象,这隐藏了很多麻烦。
编辑:
您在回答和评论中提到要取消异步方法,但您也提到这不是任务。
这让我很困惑。假设您有一个 class 用于处理启动/停止代码。
-开始
当你想开始你的插件的异步处理时,你必须创建一个 new CancellationTokenSource()
,并将它作为私有变量保存在控制 [=56= 的 class 中].
现在假设您现在有一个想要异步 运行 的方法,并且它具有签名:
public Task Run(string anyArgument)
。
你还应该添加另一个参数,所以它变成:
public Task Run(string anyArgument, CancellationToken token)
大多数公开异步方法的库也接受 CancellationToken 的可选参数。这背后的逻辑是,当(从任何地方)你想要取消进程时,你请求令牌停止,然后它会停止任何异步操作,如果它被选中。
话虽如此,让我们去...
-停止
如果要停止操作,只需使用在Start
方法中初始化的CancellationTokenSource,然后调用cts.Cancel()
有关处理 CancellationTokens 的更多信息,您可以在文档或此
中找到
同时检查:
我正在为我的应用程序设计一个插件系统。
UI 中有一个 "Start" 按钮。当用户点击它时,应用程序应该异步调用插件dll中的方法并将"Start"更改为"Stop"。该方法几乎可以包括任何插件。当用户单击 "Stop" 时,该异步方法应立即终止 。
我想用Thread.Abort();
但是大家都建议不要用。如果我使用 CancellationTokenSource,我必须向所有插件添加取消处理,我不想这样做。
我需要类似强制关机、拔出或销毁(如果需要的话! ) 用于 PC。对我来说唯一重要的是立即停止。不需要清理或类似的事情,因为我的应用程序在使用后卸载插件并且插件与主要应用程序代码无关。
有没有办法异步启动一个方法并对其进行完全控制?在这种情况下使用 Thread.Abort();
是否可以(如果我保证 dll 不会捕获线程中止异常)?
编辑: 有什么方法可以在请求时异步主动监视插件 dll (class) 中的取消令牌,同时 运行 方法和 kill 方法?
EDIT2: 我认为这不是一个好主意,但是创建一个新进程并使用 Process.kill()
怎么样?
不,恐怕您必须为取消标记使用额外的参数。
避免使用线程,因为它们非常低级,并尝试使用任务的实用程序和抽象,这隐藏了很多麻烦。
编辑: 您在回答和评论中提到要取消异步方法,但您也提到这不是任务。 这让我很困惑。假设您有一个 class 用于处理启动/停止代码。
-开始
当你想开始你的插件的异步处理时,你必须创建一个 new CancellationTokenSource()
,并将它作为私有变量保存在控制 [=56= 的 class 中].
现在假设您现在有一个想要异步 运行 的方法,并且它具有签名:
public Task Run(string anyArgument)
。
你还应该添加另一个参数,所以它变成:
public Task Run(string anyArgument, CancellationToken token)
大多数公开异步方法的库也接受 CancellationToken 的可选参数。这背后的逻辑是,当(从任何地方)你想要取消进程时,你请求令牌停止,然后它会停止任何异步操作,如果它被选中。
话虽如此,让我们去...
-停止
如果要停止操作,只需使用在Start
方法中初始化的CancellationTokenSource,然后调用cts.Cancel()
有关处理 CancellationTokens 的更多信息,您可以在文档或此
同时检查: