我想开始一个包含代码的任务:
此时事件处理程序从未被调用,所以我假设这是因为线程被阻塞等待取消令牌。
代码如下:
this.scannerTask = Task.Factory.StartNew(
() => this.Scanner(),
this.scannerCancellationTokenSource.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
private void Scanner()
{
...
this.scanner = new CLLocationManager();
this.scanner.DidRangeBeacons += HandleDidRangeBeacons;
...
try
{
this.scannerCancellationTokenSource.Token.WaitHandle.WaitOne();
}
catch(OperationCanceledException) { }
}
public void StopScanner()
{
this.scannerCancellationTokenSource.Cancel();
}
// This is the event handler
private void HandleDidRangeBeacons(object sender, CLRegionBeaconsRangedEventArgs e)
{
...
}
我看过这个问题但我不确定它是否适用于我。
我会说我不能使用异步/等待,因为我不想阻止将启动和停止扫描器的调用线程。我对吗? 有没有解决方案可以在我的任务中触发事件?
看起来您正在正确设置扫描仪 - 至少从我能看到的有限代码来看是这样。线程可能不是问题,因为事件将在它们自己的线程上触发。
还有许多其他设置步骤可以使
CLLocationManager
正常工作-尤其是在iOS上。您确实需要在具有真实信标的真实设备上进行调试。我使用 faraday fabric 来模拟进入和离开移动设备范围的信标。这对 TON 很有帮助,因为您实际上不必在房间内移动设备 - 虽然这对您的大脑起床并离开屏幕一会儿有好处。 🤗
响应您的编辑,为了从运行
DidRangeBeacons
的线程影响用户界面,您必须使用MainThread.BeginInvokeOnMainThread
见https://learn.microsoft.com/en-us/xamarin/essentials/main-线程