2014-12-06 60 views
0

我通過藍牙從外部設備接收一些數據,並且我有一個事件處理程序,只要收到數據就會觸發。這是一個非常基本的應用,在那裏我有主網頁當被按下時,執行以下功能上的按鈕:無法訪問Windows Phone 8中的TextBlock屬性

async void BLE_Function() 
    { 
     //some code to connect to the device 

     thermometerCharacteristic.ValueChanged += temperatureMeasurementChanged; //this is where I had a function to the event handler 

     await thermometerCharacteristic 
      .WriteClientCharacteristicConfigurationDescriptorAsync(
       GattClientCharacteristicConfigurationDescriptorValue.Notify); 
    }  

public void temperatureMeasurementChanged(GattCharacteristic sender, GattValueChangedEventArgs args) 
    { 
     //Store the incoming bytes in a byte array called "temperatureData" 

     foreach (byte b in temperatureData) 
     { 
      Debug.WriteLine(b.ToString()); 
     } 
    }  

現在的問題是,我想顯示在一個簡單的TextBlock這也是用戶接收的字節在MainPage上就像上面的代碼一樣,但是當我在foreach循環中寫入MyTextBlock.Text = b.ToString()時,Visual Studio引發了訪問衝突異常。我在BLE_Function()中使用了相同的TextBlock,並且在那裏工作正常,所以我不明白爲什麼我無法通過temperatureMeasurementChanged函數訪問它。下面粘貼有異常的詳細信息:

System.UnauthorizedAccessException的是由用戶代碼
的HResult = -2147024891
消息=無效跨線程訪問未處理。
源= System.Windows
堆棧跟蹤: 在MS.Internal.XcpImports.CheckThread() 在System.Windows.DependencyObject.SetValueInternal(的DependencyProperty DP,對象的值,布爾allowReadOnlySet) 在System.Windows.Controls。 TextBlock.set_Text(字符串值) 在PhoneApp2.MainPage.displayText(字節數據) 在PhoneApp2.MainPage.temperatureMeasurementChanged(GattCharacteristic 發件人,GattValueChangedEventArgs參數)
的InnerException:

提前致謝。

回答

1

由於您試圖從GUI線程以外的其他線程更新GUI,因此引發異常。您必須使用Dispatcher.BeginInvoke()來更新GUI。你可以找到一個例子here

+0

謝謝,這工作,但如果這是一個線程問題,我不明白我能夠直接從異步BLE_Function訪問TextBlock,但不是從偶處理函數? – Ali250 2014-12-06 13:37:54

+0

這是因爲BLE_Function在GUI線程上,而事件處理程序位於單獨的線程上,因爲它是異步調用的。 – venerik 2014-12-06 13:45:48