为什么我的代码在Geofencing中没有Dispatcher.RunAsync时无法工作

时间:2014-07-29 12:53:59

标签: c#

为什么没有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 个答案:

答案 0 :(得分:1)

事件Current_GeofenceStateChanged在GUI线程之外被触发,只有GUI线程可以更改GUI元素。 Dispatcher.RunAsync表示里面的代码应该在GUI线程上运行,因此它可以工作。

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

就可以了
  Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => textv2.Text = StringVariable;);

编辑:我之前只注意到你有XAML代码,你可以把字符串放在属性上,然后将属性绑定到文本框的文本值,让你从Dispatcher中解脱出来。 / p>

<TextBox Text="{Binding StringVariable}"/>

并且代码只有

public string StringVariable { get; set; }

而不是方法只是将值设置为属性

StringVariable = "bla bla";