3


0

メインプロセスとは非同期に動作するプログレスバーを作成しようとしています。 私は新しいイベントを作成しましたが、プログレスバーで操作を実行しようとするたびに次のエラーを受け取りました。

「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

次のコードは、プログレスバーのインスタンスをオブジェクトとしてイベントに送信しようとしたものです。明らかに失敗しましたが、コードがどのように見えるかを理解することができます。

プライベートイベントEventHandlerのインポート。

void MdbDataImport_importing(オブジェクトセンダ、イベント引数e){ProgressBar pb =(ProgressBar)センダ。 while(true){if(pb.Value> = 200)pb.Value = 0;

pb.Value = 10; }}

プライベート無効btnImport_Click(オブジェクトセンダ、RoutedEventArgs e){importing = new EventHandler(MdbDataImport_importing); IAsyncResult aResult = null;

aResult = importing.BeginInvoke(pbDataImport、null、null、null);

importing.EndInvoke(aResult); }

誰もがこれを行う方法のアイデアを持っていますか。

前もってありがとうSumGuy。

4 Answer


5


あなたはこのようなものを使うべきです

pb.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal、new Action(delegate(){

if(pb.Value> = 200)pb.Value = 0;

pb.Value = 10; ;));

whileループで


0


pbDataImportをディスパッチャに委任する必要があります。 GUIディスパッチャだけがGUIコントロールに変更を加えることができます:)


0


私はそれをさらに検討しました、そして非同期メソッドはMSDNからの以下のメソッドと同様にうまくいくでしょう。

XAMLの場合:


C#の場合:

ProgressBar progbar = new ProgressBar(); progbar.IsIndeterminate = false; progbar.Orientation = Orientation.Horizo​​ntal; progbar.Width = 150; progbar.Height = 15; Duration期間= new Duration(TimeSpan.FromSeconds(10)); DoubleAnimation doubleanimation = new DoubleAnimation(100.0、期間); progbar.BeginAnimation(ProgressBar.ValueProperty、doubleanimation);

私の問題は、プログレスバーを実行したいときにストアドプロシージャを実行していたことです。これにより、プロセスが停止し、非同期であってもプログレスバーが少しゴミになります。

私は他の可能性はストアドプロシージャのアクションを非同期にすることになるだろうと思いますが、皆さんはどう思いますか?

乾杯、SumGuy

編集する(2010年5月17日)

多くの人がこの記事に興味を持っているようですので、私はこれを追加したいと思いました。 私は、WPFでの非同期作業をプログレスバーについての非常に詳細に説明した素晴らしい記事を見つけました。


0


私はMVVMとBackgroundWorkerをもう少しよく使うのが好きです。 これがその例です。

http://www.rhyous.com/2010/12/29/a-progress-bar-using-wpfs-progress-bar-control-backgroundworker-and-mvvm/[WPFのProgressBarコントロールを使用したプログレスバー、BackgroundWorker、およびMVVM]