[英]Windows Phone 8.1 GPS background task
我在WP8.1上编写了一个GPS跟踪应用程序,但遇到了一些困难。 我能够在任务中创建任务并做我需要做的一切,但是我不能取消它。 作为参考,我正在使用此答案
这是我使用的任务构造函数(也可以通过TaskFactory进行尝试):
public async void run()
{
IProgress<object> progress = new Progress<object>(_ => track());
//Above is needed to be able to update the UI component
Task.Run(async () =>
//Need to run async because the task is a GPS position call that has a delay
{
while (true)
{
await Task.Delay(1000);
progress.Report(null);
}
}, tokenSource.Token);
}
我在主类部分中将tokenSource对象创建为公共变量,以便能够通过button_click stop方法访问它(否则,我将无法使用tokenSource.Cancel())
当我在构造方法中使用tokenSource.Cancel()时,一切正常。 但是当我尝试通过Button_click像这样使用它时:
private void Button_Stop(object sender, RoutedEventArgs e)
{
tokenSource.Cancel();
}
什么都没发生。 任何人有什么解决方案吗?
这是否意味着如果您每次使用async()每次创建带有新令牌并单击按钮的新线程时,我都将取消已关闭该线程的原始线程? 如果有的话,如何解决这个问题?
.Net中的取消是协作的。 您从外部取消它,并且需要从内部观察取消。 目前,您仅表示取消。
您的任务需要以某种方式检查令牌并停止任务:
Task.Run(async () =>
{
while (true)
{
tokenSource.Token.ThrowIfCancellationRequested();
await Task.Delay(1000);
progress.Report(null);
}
}, tokenSource.Token);
由于这正是实现CancellationToken
的Task.Delay
重载的完全实现方式,因此您可以仅依靠它引发异常:
Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000, tokenSource.Token);
progress.Report(null);
}
}, tokenSource.Token);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.