为啥我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复]

Posted

技术标签:

【中文标题】为啥我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复]【英文标题】:Why my code wont work without Dispatcher.RunAsync in Geofencing [duplicate]为什么我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复] 【发布时间】:2014-09-20 20:30:59 【问题描述】:

为什么没有 Dispatcher.RunAsync 这段代码不能工作,它有什么作用?如果没有 Dispatcher,它在将值复制到 textv.Text 时会抛出错误“那是它在不同的线程上”

     async void Current_GeofenceStateChanged(GeofenceMonitor sender, object args)
    
        var reports = sender.ReadReports();

        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        
            foreach (var report in reports)
            
                GeofenceState st = report.NewState;
                Geofence gf2 = report.Geofence;
                if (st == GeofenceState.Entered)
                
                    textv2.Text = "Hello"; //XAML TEXT
                
                else if(st==GeofenceState.Exited)
                
                    textv2.Text = "Bye";
                
            
        );

    

【问题讨论】:

【参考方案1】:

事件Current_GeofenceStateChanged 在 GUI 线程之外触发,只有 GUI 线程可以更改 GUI 元素。 Dispatcher.RunAsync 说里面的代码应该在 GUI 线程上运行才能正常工作。

如果你把结果放在一个字符串变量上,如果你只放:

  Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => textv2.Text = StringVariable;);

编辑:我只注意到稍后您有 XAML 代码,您可以将字符串放在属性上并将属性绑定到文本框的文本值,让您从 Dispatcher 中解放出来。

<TextBox Text="Binding StringVariable"/>

并且在代码上只有

public string StringVariable  get; set; 

在方法上只是将值设置为属性

StringVariable = "bla bla";

【讨论】:

以上是关于为啥我的代码在地理围栏中没有 Dispatcher.RunAsync 时无法工作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android 地理围栏 - 没有未来的意图?

当您走进地理围栏时,如何为简单的信息敬酒?

在 Google 的地理围栏教程中没有看到地理围栏转换

在后台服务中创建地理围栏

应用程序在后台 ios 中时地理围栏不起作用

地理围栏有效,但一段时间后停止触发