c# BackgroundWorker -如何取消worker.CancellationPending地位

本文关键字:取消 worker CancellationPending 地位 BackgroundWorker 何取消 | 更新日期: 2023-09-27 18:08:22

我有一个调用第三方远程服务器的应用程序。我使用BackgroundWorker来异步运行它。

如果我调用CancelAsync()来取消远程进程,然后使用worker。CancellationPending状态触发对此远程服务器上Close()方法的调用,远程服务器弹出消息"您正在尝试关闭此进程,这是您想要的吗?"和Yes/No按钮。

如果用户按下Yes,则没有问题,远程服务器关闭。但是,如果用户按下No,那么我如何取消CancellationPending状态,以便我的进程可以继续,直到用户再次调用CancelAsynch() ?

编辑:下面的第一个答案:我如何处理这样一个事实,即用户可以选择不关闭远程服务器并使其运行,而我的应用程序处于无法更改的取消状态?

编辑:在你的键盘战士标记为重复之前,阅读该死的问题。

c# BackgroundWorker -如何取消worker.CancellationPending地位

CancellationPending应该在请求Cancel时设置为true,并且永远不会设置回false。这将导致不可预测的行为:如果取消已经被观察到,如果没有呢?在一种情况下,操作会被取消,而在另一种情况下则不会。

作为一般规则,你不应该在BackgroundWorker逻辑中有用户交互。(它被称为BackgroundWorker是有原因的)。

请记住,CancelAsync()是异步的,所以如果您在计算过程中请求用户交互,MessageBox可能会在几秒钟/几分钟后,当用户正在做完全不同的事情时弹出。

如果正确地隔离线程,就不会出现这种问题。

在呼叫CancelAsync() ?

之前,您应该询问用户确认

用户请求取消->您请求确认->调用CancelAsync()