1

C# アプリケーションから Windows8 でインターネット接続をテストしようとしています。接続ステータスを返すブール型の変数があります。ブール値が true の場合: 何もしません。ブール値が false になったら、私の " NetworkDisconection" ページを読み込みます。ただし、この行をデバッグすると:

if (this.Frame != null)

例外があります:

アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))

ええ、このメソッドは別のスレッドにあります。どうすればこれを解決できますか?

private bool bConection;

public HUB()
    {
        this.InitializeComponent();
        bConection = NetworkInformation.GetInternetConnectionProfile()!= null;
        NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged;
    }

    void NetworkInformation_NetworkStatusChanged(object sender)
    {

        if (NetworkInformation.GetInternetConnectionProfile() == null)
        {
            if (bConection == false)
            {
                bConection = true;
            }   
        }
        else
        {
            if (bConection == true)
            {
                bConection = false;

                if (this.Frame != null)
                {
                    Frame.Navigate(typeof(NetworkDisconection));
                }
            }
        }
    }
4

2 に答える 2

1

次のコードを使用すると、問題が解決するはずです...

  Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                if (this.Frame != null)
                {
                    Frame.Navigate(typeof(NetworkDisconection));
                }
            });

コードが XAML ページのコード ビハインド (this.Frame への参照) にあるように見えるため、Dispatcher を直接取得できるはずです。

C # Win8 Dev Forumsには、有益な情報がたくさんあります。Dispatcher を検索すると、それに関するいくつかの議論が見つかります。いつものように、他の優れたリソースについてはGenAppをチェックしてください。

于 2013-01-16T17:53:45.253 に答える
0

NetworkInformation.NetworkStatusChangedイベントは非 UI スレッドで発生しますWinFormsWPFと同様に、UI スレッド上のコントロールにアクセスすることはまだ制限されています。

この側面を回避するには、WinFormsまたはWPFthis.Invokeで/を使用する場合と同様に、UI スレッドを呼び出す必要がありますthis.Dispatcher.Invoke

最初は使おうとするかもしれませんが、いつもここWindow.Current.Dispatcher.RunAsync()にあることに気付くでしょう。Window.Currentnull

代わりに、名前空間で使用する必要CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync()があります。Windows.ApplicationModel.Coreええ、それは確かに非常に一口なので、App.csでこのヘルパー メソッドをお勧めします。

using Windows.ApplicationModel.Core;
using Windows.UI.Core;

public static IAsyncAction ExecuteOnUIThread(DispatchedHandler action)
{
  var priority = CoreDispatcherPriority.High;
  var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

  return dispatcher.RunAsync(priority, action);
}

このヘルパー メソッドもお勧めします。

public static bool CheckInternetAccess()
{
  var profile = NetworkInformation.GetInternetConnectionProfile();

  if (profile == null) return false;

  var connectivityLevel = profile.GetNetworkConnectivityLevel();
  return connectivityLevel.HasFlag(NetworkConnectivityLevel.InternetAccess);
}

そして最後に:

async void NetworkInformation_NetworkStatusChanged(object sender)
{
  var isConnected = CheckInternetAccess();

  await ExecuteOnUIThread(() =>
  {        
    if (!isConnected && this.Frame != null)
      this.Frame.Navigate(typeof(ConnectionLostPage));
  });
}
于 2013-01-16T17:59:35.717 に答える