C# 应用程序停用期间取消任务时的竞争条件

C# 应用程序停用期间取消任务时的竞争条件,c#,exception,windows-phone-8,async-await,lifetime,C#,Exception,Windows Phone 8,Async Await,Lifetime,我正在尝试在我的WindowsPhone8应用程序中使用基于任务的异步模式。其思想是,所有长时间运行的操作都引用了一个取消令牌,并且在应用程序中有一个地方存储了所有这些令牌。当应用程序接收到停用事件时,它迭代所有令牌并取消它们 问题是,具有长时间运行操作的线程没有计划在应用程序停用时运行,这意味着如果我尝试使用CancellationToken.ThrowIfCancellationRequested()Thread.Sleep(1000)),即暂停调用取消的线程一段时间,然后第二个线程有机会运

我正在尝试在我的WindowsPhone8应用程序中使用基于任务的异步模式。其思想是,所有长时间运行的操作都引用了一个取消令牌,并且在应用程序中有一个地方存储了所有这些令牌。当应用程序接收到<代码>停用事件时,它迭代所有令牌并取消它们

问题是,具有长时间运行操作的线程没有计划在应用程序停用时运行,这意味着如果我尝试使用
CancellationToken.ThrowIfCancellationRequested()token.Register(()=>Thread.Sleep(1000)),即暂停调用取消的线程一段时间,然后第二个线程有机会运行,所有内容都会像符咒一样被取消。然而,这是一个肮脏的黑客,我不想在我的应用程序中使用它

问题是如何确保在操作取消完成时应用程序未退出?我假设协作取消的标志是OperationCancelledException抛出,但如何等待它,特别是当我只引用CancellationTokenSource而没有引用Task对象时?还有别的方法知道吗

非常感谢


另外,如果您需要更多的代码来帮助我,请询问。

我认为在您的案例中存储所有的
CancellationToken
S是不够的,您还需要存储相应的
任务。在您的
停用
处理程序中,您将取消所有令牌,然后
等待
所有存储的
任务
s(捕获
操作取消异常
s)。(我不确定
停用
如何与
异步
协同工作,您可能需要一些东西让系统知道您实际上还没有完成停用。)

为什么这不是您想要的?为什么只有在应用程序恢复后才取消操作才重要呢?我的工作线程没有收到取消通知,这就是问题所在。它应该停止写入文件并在取消请求时正确关闭它,然后抛出OperationCancelledException作为成功取消的确认。若它不会在应用程序停用前发生,那个么文件可能会处于某种意外状态,因为应用程序可能在停用后被终止。谢谢,我已经尝试过了,我认为它应该可以工作。但是,我在实现方面有一个问题。你认为在这个问题上添加细节或者单独创建一个问题有意义吗?