0

我有一个在浏览器中运行的 SL 应用程序。用户按下按钮并OpenFiledDialog显示a。当用户选择了一个文件后,我想对其进行一些处理。但是,我还想显示一个进度条并允许用户取消操作。

我的代码:

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();

但是,我得到了一个InvalidOperationExceptionFileInfo.OpenRead()因为This operation can only occur on the UI Thread..

但是,如果我在 UI 线程上进行工作,只要处理完成,UI 就会冻结。而且我无法在 UI 线程上打开流,然后在后台线程上处理它,因为这会导致跨线程使用错误。

我认为这是一个常见问题,但我没有找到解决方案。在这种情况下我有什么选择?先将其读入内存字节数组,然后再证明?还要别的吗?

谢谢!

4

1 回答 1

1

不要调用 dialog.File.OpenRead(); 在一个单独的线程中。在 UI 线程上调用它,他们获取从 opendialog 返回的文件并将其设置为私有属性,然后在后台线程上处理它,例如上传它。

OpenFileDialog 在 SL 中有一些限制。查看我的问题了解更多详情。对话框必须由用户启动。银光

问候。

于 2012-04-23T09:54:46.213 回答