0

ブラウザで実行されている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スレッドでストリームを開いてから、バックグラウンドスレッドで処理することはできません。これは、クロススレッドの使用でエラーが発生するためです。

これはよくある問題だと思いますが、解決策を見つけることができませんでした。この場合の私のオプションは何ですか?最初にそれをメモリ内のバイト配列に読み取り、次にそれを証明しますか?他に何か?

ありがとう!

4

1 に答える 1

1

dialog.File.OpenRead();を呼び出さないでください。別のスレッドで。UIスレッドで呼び出すと、opendialogからファイルが返され、プライベートプロパティに設定されてから、バックグラウンドスレッドで処理されます(アップロードなど)。

OpenFileDialogには、SLにいくつかの制限があります。詳細については私の質問をチェックしてください。ダイアログはユーザーが開始する必要があります。Silverlight

よろしく。

于 2012-04-23T09:54:46.213 に答える