C# 异步和调度程序解释

C# 异步和调度程序解释,c#,events,async-await,uwp,C#,Events,Async Await,Uwp,我有一个使用下面代码的类。另外,我正在使用另一个类来检查网络连接的可用性。这个类提供了一个事件,我用它来启动和停止计时器 如果事件被触发,我总是会收到一条错误消息 应用程序调用了为不同线程封送的接口 因此,经过一些研究,我使用以下代码解决了这个问题: public void OnNetworkAvailabilityChanged(object source, EventArgs e) { if (NetworkAvailabilty.Instance.IsNet

我有一个使用下面代码的类。另外,我正在使用另一个类来检查网络连接的可用性。这个类提供了一个事件,我用它来启动和停止计时器

如果事件被触发,我总是会收到一条错误消息

应用程序调用了为不同线程封送的接口

因此,经过一些研究,我使用以下代码解决了这个问题:

    public void OnNetworkAvailabilityChanged(object source, EventArgs e)
    {
        if (NetworkAvailabilty.Instance.IsNetworkAvailable)
        {
            Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            () =>
            {
                timerUpdate.Start();
            });

        }
        else
        {
            Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            () =>
            {
                timerUpdate.Stop();
            });                
        }            
    }
但问题的背后是什么?doeas这部分代码是如何防止此错误消息的? 即使在这里VisualStudio告诉我,我也应该考虑在Windows之前使用Apple… 但问题的背后是什么

Dispatchermer是在UI线程上创建的,与大多数UI组件一样,它被称为线程仿射对象。这意味着它绑定到它的UI线程,现在属于它

NetworkAvailability不是UI组件,它总是在线程池线程上引发其NetworkAvailabilityChanged事件

因此,OnNetworkAvailabilityChanged在线程池线程上运行,它尝试访问绑定到UI线程的Dispatchermer。这就是导致异常的原因:

应用程序调用了为不同线程封送的接口

这意味着Dispatchermer是为UI线程编组的,因此绑定到UI线程,但是您的应用程序正在从线程池线程调用它的一个方法

doeas这部分代码是如何防止此错误消息的

RunAsync在UI线程上执行其委托

就个人而言,我更喜欢使用SynchronizationContext而不是Dispatcher/CoreDispatcher。如果确实使用了dispatcher,则应等待调用并使OnNetworkAvailabilityChanged成为异步void事件处理程序

但问题的背后是什么

Dispatchermer是在UI线程上创建的,与大多数UI组件一样,它被称为线程仿射对象。这意味着它绑定到它的UI线程,现在属于它

NetworkAvailability不是UI组件,它总是在线程池线程上引发其NetworkAvailabilityChanged事件

因此,OnNetworkAvailabilityChanged在线程池线程上运行,它尝试访问绑定到UI线程的Dispatchermer。这就是导致异常的原因:

应用程序调用了为不同线程封送的接口

这意味着Dispatchermer是为UI线程编组的,因此绑定到UI线程,但是您的应用程序正在从线程池线程调用它的一个方法

doeas这部分代码是如何防止此错误消息的

RunAsync在UI线程上执行其委托

就个人而言,我更喜欢使用SynchronizationContext而不是Dispatcher/CoreDispatcher。如果确实使用了dispatcher,则应等待调用并使OnNetworkAvailabilityChanged成为异步void事件处理程序

    public void OnNetworkAvailabilityChanged(object source, EventArgs e)
    {
        if (NetworkAvailabilty.Instance.IsNetworkAvailable)
        {
            Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            () =>
            {
                timerUpdate.Start();
            });

        }
        else
        {
            Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            () =>
            {
                timerUpdate.Stop();
            });                
        }            
    }