Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 如何在WPF中取消被阻止的任务_C#_Wpf_Multithreading - Fatal编程技术网

C# 如何在WPF中取消被阻止的任务

C# 如何在WPF中取消被阻止的任务,c#,wpf,multithreading,C#,Wpf,Multithreading,我使用WPF创建一个窗口,同时创建一个新任务来实现时间成本计算作业,这也将在完成任务之前阻止该任务 现在我想使用一个按钮,可以取消和退出被阻止的任务,尽管它仍然处于活动状态。Microsoft文档建议使用CancellationToken取消任务,但问题是我无法检查是否触发了IsCancellationRequested标志,因为被阻止的任务没有检测标志的循环,无法正常退出任务。我还尝试使用Thread.Abort()强制关闭线程,但它会导致PlatformNotSupportedExcepti

我使用WPF创建一个窗口,同时创建一个新任务来实现时间成本计算作业,这也将在完成任务之前阻止该任务

现在我想使用一个按钮,可以取消和退出被阻止的任务,尽管它仍然处于活动状态。Microsoft文档建议使用
CancellationToken
取消任务,但问题是我无法检查是否触发了
IsCancellationRequested
标志,因为被阻止的任务没有检测标志的循环,无法正常退出任务。我还尝试使用
Thread.Abort()
强制关闭线程,但它会导致
PlatformNotSupportedException


因此,我想知道是否有任何方法可以取消被阻止的任务/线程及其子任务/线程,或者WPF是否有任何方法可以关闭除主UI线程之外的所有任务/线程。

您可以取消等待任务的任何位置,从而防止它阻止任何事情。这可以通过使用超时、取消令牌或两者兼而有之的重载来实现

如果您想以某种方式取消丢到以太中的任务,那么唯一的方法是在构建该任务时将取消令牌传递给它,然后在任务中调用的方法的不同点使用ThrowIfCancellationRequested或IsCancellationRequested来检查这一点


在寻找进一步信息时发现了这一点(spoiler,您只能执行上述操作,这是一种推荐的编码实践/安全):

您不能取消不支持取消的操作,但可以忽略它产生的任何返回值,只需在其他线程中继续。Task.Run()=>YourLongRunningFunction)。等待(2000);在函数内部,设置条件以检查属性是否为False或true以取消任务您有了新任务。这需要长时间的操作。它还阻止了其他一些任务。我不清楚后一项任务是什么。您是否需要长任务来阻止您所说的其他任务?@mm8我取消该任务只是因为硬件以意外方式运行,在取消该任务后,我仍然需要重新启动同一作业。如果我忽略它,会不会导致程序中出现多个无用线程并有趣地卡住计算机?@ErwinDraconis检查属性需要一个while/for循环,对吗?但是程序没有循环来执行作业是的,我考虑了超时和取消令牌。因为作业需要很长的时间来完成,超时将非常大。那意味着我要等很长时间。另一方面,取消令牌需要程序中的while/for循环来检查IsCancellationRequested,但程序不需要循环来执行作业。