如何在此WPF应用程序中立即中止后台执行?

时间:2019-11-05 09:11:46

标签: wpf vb.net multithreading backgroundworker

我正在vb.net中创建一个WPF GUI应用程序,该应用程序需要与COM API交互以执行一些处理器密集型工作。最初,我将作品放置在BackgroudWorker中:

worker = New BackgroundWorker()
AddHandler worker.DoWork, AddressOf tsm.SAP_DoWork
AddHandler worker.ProgressChanged, AddressOf tsm.SAP_ProgessChanged
AddHandler worker.RunWorkerCompleted, AddressOf tsm.SAP_Completed

worker.RunWorkerAsync()

tsm对象具有对mainWindow的引用,该引用在ProgressChanged处理程序中已更新。除以下几点外,此方法非常有效:如果用户单击中止按钮,我需要能够立即中止SAP_DoWOrk函数。

现在,根据我对BackgroundWorker合作取消模式的理解,这意味着启用取消功能:

worker.WorkerSupportsCancellation = True

然后在SAP_DoWork函数中检查此标志。问题在于此函数在多个子类中调用了许多单独的处理器密集型函数,并且还具有大量逻辑,我希望线程在取消后立即停止。.现在看来,我有两个选择:

  1. 在每个操作之前检查是否取消,并在调用堆栈中一直中止线程。这意味着子类还需要了解取消操作,并且这似乎是一种糟糕的方法。
  2. Abondon做为BackgroundWorker的工作方式,并找到了一些支持安全地终止线程的功能。不需要保存后台工作的数据和进度,只要它不影响主线程即可。

我真的不想做1,所以在VB.NET WPF应用程序中有没有办法做2?我对BackgroundWorker的工作方式有一些基本的误解吗?

0 个答案:

没有答案