ブラウザで実行されているSLアプリケーションがあります。ユーザーがボタンを押すと、OpenFiledDialog
が表示されます。ユーザーがファイルを選択したら、そのファイルに対して何らかの処理を行いたいと思います。ただし、プログレスバーを表示して、ユーザーが操作をキャンセルできるようにすることも必要です。
私のコード:
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();
しかし、私はInvalidOperationException
乗る。FileInfo.OpenRead()
This operation can only occur on the UI Thread.
ただし、UIスレッドで作業を行うと、処理が行われている限りUIがフリーズします。また、UIスレッドでストリームを開いてから、バックグラウンドスレッドで処理することはできません。これは、クロススレッドの使用でエラーが発生するためです。
これはよくある問題だと思いますが、解決策を見つけることができませんでした。この場合の私のオプションは何ですか?最初にそれをメモリ内のバイト配列に読み取り、次にそれを証明しますか?他に何か?
ありがとう!