如何在此WPF应用程序中立即中止后台执行?
我正在vb.net中创建一个WPF GUI应用程序,它需要与COM API交互以执行一些处理器密集型工作。最初,我将工作安排在一个背景工作人员中:如何在此WPF应用程序中立即中止后台执行?,wpf,vb.net,multithreading,backgroundworker,Wpf,Vb.net,Multithreading,Backgroundworker,我正在vb.net中创建一个WPF GUI应用程序,它需要与COM API交互以执行一些处理器密集型工作。最初,我将工作安排在一个背景工作人员中: worker=newbackgroundworker() AddHandler worker.DoWork,tsm.SAP_DoWork的地址 AddHandler worker.ProgressChanged,tsm.SAP_ProgressChanged的地址 AddHandler worker.runworker已完成,tsm.SAP\u的地址
worker=newbackgroundworker()
AddHandler worker.DoWork,tsm.SAP_DoWork的地址
AddHandler worker.ProgressChanged,tsm.SAP_ProgressChanged的地址
AddHandler worker.runworker已完成,tsm.SAP\u的地址已完成
worker.RunWorkerAsync()
tsm对象具有对在ProgressChanged处理程序中更新的主窗口的引用。这非常有效,除了一件事:如果用户单击中止按钮,我需要能够立即中止SAP\u DoWOrk功能。
现在,根据我对BackgroundWorker的合作取消模型的理解,这意味着启用取消:
worker.workerSupportsScanCellation=True
然后在SAP_DoWork函数中检查此标志。问题是这个函数在几个子类中调用了许多独立的处理器密集型函数,并且还有大量的逻辑,我希望线程在被取消时立即停止。。现在看来我有两个选择:
我真的不想做1,那么在VB.NET WPF应用程序中有没有做2的方法?我对BackgroundWorker的工作方式是否有一些基本的误解?选项2不会是“合作的”…请参见(例如,在按钮的单击事件中,从
DoWork
方法之外)。在DoWork
方法中,检查是否为true
。在这种情况下,设置e.Cancel=true
@Rekshino似乎即使使用Thread.Abort()也没有保证,通常认为这是不好的做法。那么答案是使用进程吗?@Jimi我不想这样做(正如我在问题中提到的),因为我需要在每个操作之前进行检查,包括在调用堆栈下面的函数中。这将是整个逻辑中“if x then abort”调用的巨大混乱,这似乎并不理想。