問題タブ [backgroundworker]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - Dispatcher で WPF オブジェクトにアクセスするには?
MVVM パターンを使用して WPF アプリケーションを開発しています。
アプリはサーバーからキャプチャ イメージを読み込み、準備ができたら WPF フォームのイメージに割り当てます。次のように、BackgroundWorker を使用してスレッドを実行しています。
Window がロードされると、以下が呼び出されます。
GetCaptchaImage 関数はかなり単純で、画像を別のスレッドにロードします。
Dispatcher を呼び出して、この ImageSource を Window のイメージ ソースに割り当てる方法を知る必要があります。現在、次のように _tempBitmap を読み込んだ後に Dispatcher を呼び出します。
CaptchaBitmap が画像ソースにデータバインドされている場所。
ただし、これを行うと、InvalidOperationException がスローされ、_tempBitmap への参照は GUI スレッドでエラーを返します。BackgroundWorker スレッドで作成されたときにディスパッチャー GUI スレッドからアクセスしているため、それはわかっていますが、どうすれば回避できますか?
助けていただければ幸いです。:)
.net - ProcessStartInfo.UseShellExecute = false は、別のスレッドで FreeImageNet によって奇妙な動作を引き起こす可能性がありますか?
画像のサイズを変更するために BackgroundWorker でプロセスを実行しています。UseShellExecute = false
プロセスのstartinfoを設定すると、UI スレッドでFreeImageNetライブラリを使用して画像を同時に操作すると、奇妙な動作が発生します。奇妙な動作はCloseMultiBitmap()
、メソッドを介して新しい画像を閉じようとすると動作しているように見えますが、最終的な画像ではなく、FICACHE および FISPOOL ファイルのみが残ることです。設定するとUseShellExecute = true
、すべてが期待どおりに機能します。
backgroundworker プロセスは、ImageMagick の convert.exe コマンドライン プログラムを呼び出します。ただし、コマンドを実行すると発生します。UseShellExecute プロパティが原因のようです。異なるスレッドから同じ画像に取り組んでいないことを保証します。
基本的に、プログラムは分割およびマージ操作のために複数ページの tiff ファイルをロードします。TIFF を読み込むと、各ページが元のページから抽出され、一時フォルダーに保存されます。次に、backgroundworker を使用して、各ページのプレビュー イメージを生成します。これには 1 ページあたり約 0.5 秒かかるため、60 ページの tif の読み込みには時間がかかる場合があります。プレビュー画像を読み込んでいる間、マージと分割を行うことができます。現時点では、元の画像のみを操作します。
UseShellExecuteに光を当てられる人はいますか? StandardError を読めるようになりたいです。このプロパティが別のスレッドで実行されているコードにどのように影響するかわかりません。
御時間ありがとうございます。
c# - C#backgroundWorkerは文字列を報告しますか?
文字列(「ファイルを検索しています。。。。」、「選択範囲が見つかりました。。。。」など)をbackgroundWorkerとパーセンテージからwindows.formに報告するにはどうすればよいですか。さらに、backgroundWorker_Workで実行するメソッドを含む大きなクラスがあります。Class_method();で呼び出すことができます。しかし、その後、backgroundWorker_Workメソッドからのみ、呼び出されたクラスからの完了率などを報告できません。
ありがとう!
c# - backgroundWorker の外部クラスから呼び出されたメソッドからフォームのメソッドを呼び出すにはどうすればよいですか?
backgroundWorker の外部クラスから呼び出されたメソッドからフォームのメソッドを呼び出すにはどうすればよいですか? デリゲートは何とかこの質問に対する答えだと思いますが、時間をかけて読んだ後でも、この問題にまだ混乱しています。
これは Visual Studio 2008 で、backgroundWorkerはフォームから実行され、ExternalClass.Methodを呼び出します。フォームは名前空間 ProgramNameにあり、ExternalClassはProgramNameを使用して います。windows.form のファイルの名前空間ProgramNameでパブリック デリゲートMyDelegateを宣言すると、 MyDelegateのインスタンスを作成してフォームのメソッドで呼び出すことができます (ただし、これは役に立ちません)。MyDelegateのインスタンスを作成し、外部クラスのメソッドから呼び出します。公開されているにもかかわらず、windows.form のメソッドにアクセスできません。
ありがとう
はい、 ExternalClass.Methodから進捗レポート (int パーセント、文字列ステータス) を返したいです。その CSharpAtl (または誰か) についてもう少し説明していただけますか?
c# - コレクションアイテム内で使用されるBackgroundWorker
時間のかかるタスクを実行するために、Backgroudworkerを使用していくつかの作業を行いました。
別の方法でバックグラウンドワーカーを開始します。
次に、イベント処理を行いました。
ご覧のとおり、完了時にワーカーを最初からやり直しました。これで、これは1人のバックグラウンドワーカーで機能します。
今、私はコレクションが欲しいです、そして各アイテムはこのタスクを実行するべきです。ただし、上記の概念では、ワーカーを最初からやり直すため、最初に開始したワーカーで実行を継続します。私は、タイマーを組み合わせることで状況を解決し、他のワーカースレッドに道を譲ることができるのではないかと考えています。
BackgroundWorkerはまだ良い選択ですか?私のようにBackgroundWorkerを再利用するのは一般的ですか?
編集1:明確にするために:私が直面している問題は、それぞれ独自のBackgroundWorkerを使用してコレクションを管理する必要があるということです。各アイテムから定期的にリクエストを出すタイマーを考えていました。これは私が立ち往生しているところです。
編集2:私自身の答えを見てください、私はこの問題を解決しませんでしたが、私が欲しいものを手に入れるためにタイマーと一緒に行くことができることがわかりました。
編集3:私が達成したかったことを明確にするために(別の試み、私はそれが得意ではありません):GPS追跡用の追跡オブジェクトがあります。私はそれらの全体を追跡したいので、追跡デバイスごとに1つのオブジェクト。それらはすべて頻繁にポーリングする必要があります。単一のテストオブジェクト用にBackgroundWorkerを設定しました。私は、Backgroundworkerが完了したときに教えてくれる方法が好きでした。しかし、すべての追跡オブジェクトで機能させることはできませんでした。
現在、すべての追跡オブジェクトには独自のタイマーがあります。このタイマーは新しいスレッドを生成し、時間のかかる作業を実行します(私はDoWriteと名付けました)。タイマーを破棄してから新しいタイマーを作成するため、BackgroundWorkerは必要ありません。それがすべてです。
c# - C#デリゲートをクラスで利用できるようにする
クラス全体でデリゲートを利用できるようにしたいと思います。これのポイントは、外部クラスのbackgroundWorkerから呼び出されたメソッドが、そのすべてのメソッド(ExternalClass.Run();呼び出しExternalClass.Method2(); ExternalClass.Method3();などを継続的に報告できるようにすることです。いくつかの進捗レポートを送信するために。継続的に代理人を通過しなければならないのは非効率的です。
デリゲートのインスタンスをグローバルに初期化し、Run()で渡されたインスタンスと等しくなるように設定してみました。各メソッドで使用できるようになりますが、nullオブジェクトを暗黙的に変換できないというエラーが表示されます。
ありがとう!
現在使用しているコード(ラップトップにある)がないため、使用しているコードを表示できませんが、ここでより適切に説明しようと思います。擬似コード:
毎回渡す必要はないので、なんとかしてclass2に渡したいです。
.net - BackgroundWorker が完了するまで正しく待機する方法は?
次のコードを観察してください。
bw
ここで、作業が完了するまで待ちたいとします。そうする正しい方法は何ですか?
私の解決策はこれです:
でも、私は嫌いです。
finished
フラグを同期イベントに置き換えて、RunWorkerCompleted
ハンドラーに設定し、スリープ中のループを実行する代わりに後でブロックすることを検討しました。
残念ながら、コードは WPF または WindowsForm 同期コンテキストで実行される可能性があるため、これは間違っていますRunWorkerCompleted
。
より良い解決策を知りたいです。
ありがとう。
編集:
PS
- サンプルコードは、私の質問を明確にするために意図的に工夫されています。私は完了コールバックを完全に認識していますが、完了まで待つ方法を知りたいです。それが私の質問です。
- 私は、、、などを認識してい
Thread.Join
ますDelegate.BeginInvoke
...ThreadPool.QueueUserWorkItem
質問は具体的には に関するものBackgroundWorker
です。
編集2:
わかりました。シナリオを説明すると、はるかに簡単になると思います。
いくつかの非同期コードを呼び出す単体テスト メソッドがあり、最終的にBackgroundWorker
完了ハンドラーを渡すことができる a に関与します。すべてのコードは私のものなので、必要に応じて実装を変更できます。ただし、 を置き換えるつもりはありませんBackgroundWorker
。適切な同期コンテキストが自動的に使用されるため、コードが UI スレッドで呼び出されると、完了コールバックが同じ UI スレッドで呼び出されます。これは非常に優れています。
いずれにせよ、BW が作業を完了する前に単体テスト メソッドが終了する可能性はありますが、これは良くありません。そのため、BW が完了するまで待ちたいのですが、最善の方法を知りたいと考えています。
それにはもっと多くの部分がありますが、全体像は多かれ少なかれ今説明したようなものです.
c# - バックグラウンド ワーカーの使用 - 再帰メソッドの進行状況で ProgressBar を更新する
以下は、バックグラウンドワーカーに出荷したいメソッドですが、メソッドの作成方法に基づいてそれを行う方法に苦労しています。あなたができるように、大丈夫なものは何も返しませんが、呼び出されるたびに directoryInfo オブジェクトが必要です。
バックグラウンドワーカーを使用するのはこれが初めてなので、少し行き詰まっています。ここで見つかったヘルプのおかげで何かを実装しようとしましたが、メソッドが再帰的であることに気付いたときに行き詰まりました。
ビジー ループ中に進行状況を表示するにはどうすればよいですか?
doWork イベント ハンドラー メソッドを実装しましたが、下位のサブレベルで処理するファイルやフォルダーがさらにある場合は、何らかの方法でメソッドを呼び出す必要があることに気付きました。
現在選択されているノードがディレクトリの場合、'getSizeForTargetDirectory()' メソッドを呼び出す単純なボタン クリック イベント ハンドラがあります。
うまくいけば、それが私がやろうとしていることと、それをどのように行っているかを説明しています. 質問は、出荷しようとしている作業の大部分が再帰的なメソッドから来ているときに、バックグラウンド ワーカー クラスの進行状況レポート機能をどのように使用できるかです。
初期のテストを通じて、いくつかの調整を行った後、getSize メソッドが非常に効率的であり、現在提供されているフォルダーのサイズ情報を非常に迅速に報告したことに気付きましたが、非常に強力な開発マシンを使用しているため、すべてのユーザーに当てはまるとは限りません。
読んでくれてありがとう、誰かが助けてくれることを願っています!!!
c# - C#で指定された時間後にバックグラウンドワーカーをキャンセルする方法
C# で指定した時間後にバックグラウンド ワーカーをキャンセルする方法、または応答しないバックグラウンド ワーカーをキャンセルする方法。