Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在此WPF应用程序中立即中止后台执行?_Wpf_Vb.net_Multithreading_Backgroundworker - Fatal编程技术网

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

如何在此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的地址

我正在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.RunWorkerAsync()
tsm对象具有对在ProgressChanged处理程序中更新的主窗口的引用。这非常有效,除了一件事:如果用户单击中止按钮,我需要能够立即中止SAP\u DoWOrk功能。

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

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

  • 在每个操作之前进行取消检查,并在整个调用堆栈中中止线程。这意味着子类还需要知道取消,这似乎是一种糟糕的方式
  • 了解BackgroundWorker的工作方式,并找到一些支持安全终止线程的功能。后台工作的数据和进度不需要保存,只要不影响主线程

  • 我真的不想做1,那么在VB.NET WPF应用程序中有没有做2的方法?我对BackgroundWorker的工作方式是否有一些基本的误解?

    选项2不会是“合作的”…请参见(例如,在按钮的单击事件中,从
    DoWork
    方法之外)。在
    DoWork
    方法中,检查是否为
    true
    。在这种情况下,设置
    e.Cancel=true
    @Rekshino似乎即使使用Thread.Abort()也没有保证,通常认为这是不好的做法。那么答案是使用进程吗?@Jimi我不想这样做(正如我在问题中提到的),因为我需要在每个操作之前进行检查,包括在调用堆栈下面的函数中。这将是整个逻辑中“if x then abort”调用的巨大混乱,这似乎并不理想。