1

コールバックが呼び出されると、次のようになります。

マーシャリング エラーが発生しました。

「マーシャリング」とは?? なぜ私のコールバックが無効なのか。教えてください。

ここにコードがあります。

   public Page1()//constructor
    {
        this.InitializeComponent();
        NetworkInformation.NetworkStatusChanged += new Windows.Networking.Connectivity.NetworkStatusChangedEventHandler(OnNetworkStatusChanged);//regist callback
    }

    void OnNetworkStatusChanged(object arg)//callback method
    {
        App.mainFrame.Navigate(typeof(Page2));
    }
4

1 に答える 1

1

エラー メッセージは、「Navigate」メソッドが間違ったスレッドで実行されていることを示しています (正しいスレッドで呼び出されるようにマーシャリングする必要があります)。

Windows8 では、UI と対話するコードは UI スレッドでのみ実行する必要があり、コールバック メソッド (OnNetworkStatusChanged上記のメソッドなど) は必ずしも UI スレッドで呼び出されるとは限りません。コードが他のスレッドではなく UI スレッドで実行されるようにするには、次のようなイディオムを使用します。

// somewhere in your code behind, in code that definitely runs on the UI thread
// - e.g. in the OnLoaded method of your main window:
CoreDispatcher Dispatcher = Windows.UI.CoreWindow.GetForCurrentThread().Dispatcher; 


// In your call-back method:
if ((Dispatcher != null) && (!Dispatcher.HasThreadAccess))
{
    Dispatcher.RunAsync(
                Windows.UI.Core.CoreDispatcherPriority.Normal, 
                (obj, invokedArgs) => { App.mainFrame.Navigate(typeof(Page2));}, 
                this, 
                null
     );
}
else
    App.mainFrame.Navigate(typeof(Page2));
于 2012-10-19T11:44:22.543 に答える