1

我來自VB 6,並且是VB.NET的新手。 我在寫一個Windows Phone 8應用程序。有一個網格,我有幾個textBlocks,我想動態顯示來自文件流(包含掃描數據)的數據。更改WP8文本塊時出現「無效的跨線程訪問」

當WP8頁面打開時,它會自動將數據加載到textBlocks中。這工作。在我從文件中加載數據之前,我想「重置」所有的textBlock並隱藏它們。爲此,我想用一個過程,它本質上是做下面的每一個文字塊:

tbl1.Text = "" 
tbl1.Visibility = System.Windows.Visibility.Collapsed 

這個工作原理完全一次:在頁面加載時。該過程不會產生錯誤。

類型的異常「系統:

現在,當我以後再調用該方法,當我想要刷新頁面上顯示的數據,我得到上面顯示上的第一行代碼下面的錯誤.UnauthorizedAccessException'發生在System.Windows.ni.dll中,但未在用戶代碼中處理 附加信息:無效的跨線程訪問。

我現在有點迷路了。在VB6中,我可以用我的UI元素做任何我想做的事情。我認爲我在這裏犯了一些新手錯誤?

我在某處讀了一些有關Dispatcher的東西。但是,僅僅將textBlock中的值更改爲我看起來過於複雜。有沒有簡單的方法?

+0

你用什麼方法改變這個值?它是異步運行的嗎?你能用這種方法展示更多的代碼嗎? – Romasz

+0

第一次在頁面的構造函數中調用它。但不直接。它處於非異步子過程中。 第二次它在掃描器接收到數據後的事件中調用:Private Sub oBCScanner_DataReceived(sender As Object,e As BarcodeScannerDataReceivedEventArgs) – Verun

+0

正如我第一次理解它(當頁面加載時)。那麼你第二次調用它在哪裏?一些內置方法也可以異步運行。 – Romasz

回答

3

的解決方案確實使用Dispatcher.BeginInvoke方法。

Dispatcher.BeginInvoke(() => 
{ 
    tbl1.Text = "" 
    tbl1.Visibility = System.Windows.Visibility.Collapsed 
}); 

您需要這個的原因是因爲您嘗試訪問取決於非UI線程中的UI線程的對象。

+0

這個工程。 (也感謝其他類似的答案!) 我能夠做到這一點,使用vb.net格式上面的C#代碼。我必須在子過程上使用此Dispatcher,它負責將文件數據加載到UI中: Me.Dispatcher.BeginInvoke(Sub()mLoadScannerData()) – Verun

1

這可能是因爲你沒有從UI線程調用該方法。嘗試使用Dispatcher.BeginInvoke:

Dispatcher.BeginInvoke(()=> 
    { 
     tbl1.Text = ""; 
     tbl1.Visibility = System.Windows.Visibility.Collapsed; 
    }); 
相關問題