我有一个在浏览器中运行的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线程上打开流,然后在后台线程上处理它,因为这会给跨线程的使用带来错误。
我认为这是一个常见问题,但我找不到解决方案。在这种情况下我有什么选择?先将它读到内存中的字节数组然后证明它?还要别的吗?
谢谢!
所以你说我应该读取整个文件到一个私人'字节[]'领域,然后做处理? (这是一个excel文件) – jornb87 2012-04-23 11:18:01
是的,你应该得到的字节发送线程作为参数,或者如果你可以你必须调用openread使用Dispatcher.BeginInvoke()使用UI线程来调用openread。 – 2012-04-24 04:55:09