2012-04-23 63 views
0

我有一個在瀏覽器中運行的SL應用程序。用戶按下按鈕並顯示OpenFiledDialog。當用戶選擇一個文件時,我想對它做一些處理。但是,我也想顯示一個進度條並使用戶能夠操作。Silverlight文件處理線程

我的代碼:

var dialog = new OpenFileDoalog { Filter = ... }; 

if(dialog.ShowDialog() != true) 
    return; 

// Show the Progress bar 
MyProgressBar.Visibility = System.Windows.Visibility.Visible; 

// Do the processing on another thread 
new Thread(() => 
{ 
    var stream = dialog.File.OpenRead(); 
    var data = Process(stream); 
    Dispatcher.BeginInvoke(() => IGotSomeDataForYou(data)); 
}).Start(); 

不過,我對FileInfo.OpenRead()因爲This operation can only occur on the UI Thread.得到InvalidOperationException

但是,如果我在UI線程上工作,只要處理完成,UI就會凍結。我無法在UI線程上打開流,然後在後臺線程上處理它,因爲這會給跨線程的使用帶來錯誤。

我認爲這是一個常見問題,但我找不到解決方案。在這種情況下我有什麼選擇?先將它讀到內存中的字節數組然後證明它?還要別的嗎?

謝謝!

回答

1

不要調用dialog.File.OpenRead();在一個單獨的線程。在UI線程上調用它們獲得從opendialog返回的文件,並將其設置爲私有屬性,然後在後臺線程上處理它,例如上載它。

OpenFileDialog在SL中有一些限制。查看我的問題了解更多詳情。 Dialogs must be user-initiated. Silverlight

問候。

+0

所以你說我應該讀取整個文件到一個私人'字節[]'領域,然後做處理? (這是一個excel文件) – jornb87 2012-04-23 11:18:01

+0

是的,你應該得到的字節發送線程作爲參數,或者如果你可以你必須調用openread使用Dispatcher.BeginInvoke()使用UI線程來調用openread。 – 2012-04-24 04:55:09