2012-04-23 39 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