如何在不阻塞的情况下等待引发事件的长时间运行的任务?

问题描述 投票:0回答:1

我想开始一个包含代码的任务:

  • 多次引发事件。
  • 等待(使用 CancellationToken)退出。

此时事件处理程序从未被调用,所以我假设这是因为线程被阻塞等待取消令牌。

代码如下:

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)
{
    ...
}

我看过这个问题但我不确定它是否适用于我。

我会说我不能使用异步/等待,因为我不想阻止将启动和停止扫描器的调用线程。我对吗? 有没有解决方案可以在我的任务中触发事件?

c# ios events xamarin.ios
1个回答
0
投票

看起来您正在正确设置扫描仪 - 至少从我能看到的有限代码来看是这样。线程可能不是问题,因为事件将在它们自己的线程上触发。

还有许多其他设置步骤可以使

CLLocationManager
正常工作-尤其是在iOS上。您确实需要在具有真实信标的真实设备上进行调试。我使用 faraday fabric 来模拟进入和离开移动设备范围的信标。这对 TON 很有帮助,因为您实际上不必在房间内移动设备 - 虽然这对您的大脑起床并离开屏幕一会儿有好处。 🤗

响应您的编辑,为了从运行

DidRangeBeacons
的线程影响用户界面,您必须使用
MainThread.BeginInvokeOnMainThread
https://learn.microsoft.com/en-us/xamarin/essentials/main-线程

© www.soinside.com 2019 - 2024. All rights reserved.