【发布时间】:2015-01-30 09:42:40
【问题描述】:
我正在编写一个 Windows Phone 8.1 应用程序 (WINRT)。
我正在显示 StatusBar:
- MYAPP(欢迎)
- MYAPP(通过 WIFI 连接)
- MYAPP(通过手机连接)
如果用户通过 Wifi 连接,则显示“MYAPP (CONNECTED VIA WIFI)”,如果用户通过蜂窝连接,则显示“MYAPP (CONNECTED VIA CELLULAR)”。
此外,它使用 DispatcherTimer() 在 5 秒后恢复到默认进度条文本“MYAPP (WELCOME)”;
所以,我执行 GetInternetConnectionProfile() ,返回 _connectedVia,传递给 Constructor 或 OnNavigatedTo 中的 GetInternetConnectionProfile(_connectedVia) 函数。
Connectivity.GetInternetConnectionProfile();
StatusBarClassObject.StatusBarGenerator(_connectedVia);
在第一次执行页面之前一切正常。
现在,每次发生网络更改(Wifi 到蜂窝或反之亦然或 wifi 到无等)时,它都会执行 NetworkStatusChanged 事件处理程序,过程与构造函数中相同。
NetworkInformation.NetworkStatusChanged += new NetworkStatusChangedEventHandler((n) => Connectivity.GetInternetConnectionProfile());
NetworkInformation.NetworkStatusChanged += new NetworkStatusChangedEventHandler((n) => StatusBarClassObject.StatusBarGenerator(_connectedVia));
但问题是:
StatusBarCloseTimer = new DispatcherTimer(); 这次给了我错误。第一次执行这个工作正常。
“应用程序调用了一个为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))”
我尝试使用:
await CoreDispatcherObject.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
DispatcherTimerInit();
});
private void DispatcherTimerInit()
{
// throw new NotImplementedException();
StatusBarCloseTimer = new DispatcherTimer();
StatusBarCloseTimer.Interval = TimeSpan.FromMilliseconds(3000);
StatusBarCloseTimer.Tick += StatusBarCloseTimer_Tick;
}
但是现在StatusBarCloseTimer.Start(); 给了我同样的错误:
“应用程序调用了一个为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))”
【问题讨论】:
-
通过 Dispatcher 也调用 Start() 怎么样?这个错误显然意味着你从错误的线程中调用了一些东西。
-
已解决:等待CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {}
标签: c# multithreading xaml oop windows-phone-8.1