C#を使って画面プログラムを開発しています。
画面上のあるボタンが押されたときに、時間のかかる10~100個くらいのファイルの送信
処理を行いますが、送信している最中に、ひとつひとつのファイル転送が終わったらその
結果(成功したか失敗したか)をリストボックスに表示したいです。
しかし、ボタン処理の中で、「1個転送してその転送結果をリストボックスに書く」とい
う処理を10回繰り返しても、結局、全部のファイル転送が終わってボタン押下のイベント
処理から抜けないと実際に画面には表示されません。
こういう場合には、どのようにすればいいのでしょうか?
結局、ファイル転送を別のスレッドにして、Formのオブジェクトを渡してリストボックス
に書く、ようなことが必要なのでしょうか?
> 結局、ファイル転送を別のスレッドにして、Formのオブジェクトを渡してリストボック
ス
> に書く、ようなことが必要なのでしょうか?
その通りです。
さらに,別のスレッドからコントロールを操作することは許されないの
で,Control.Invokeを呼び出す必要があります。
# Control.InvokeRequiredでないなら必要ないですが。
一応,Application.DoEventsを挟むという逃げ方もありますが,細かく呼び出さないと結
局は動作がカクカクとしてしまうので,あまりお勧め出来ません。
レス、ありがとうございます。
(ちょっとわかりにくくて難しい)delegateを使って、別スレッドから、とりあえずテキ
ストボックスに表示できましたので、これからリストボックスにさせるように変更を加え
ます。
どうも、ありがとうございました。
Delegate.BeginInvoke使うなら,BackgroundWorkerコンポーネントの利用も考えてみた方
がよいかと思います。
# こいつの存在をすっかり忘れていました。
DoWorkイベントイベントにやりたいこと記述して,ボタンのClickイベントハンドラで
RunWorkAsyncメソッド呼び出せば良いだけなので簡単です。
ファイル名の追加も,ProgressChangedイベントを使えば処理出来ます。
DoWorkは別スレッドですが,ProgressChangedイベントとRunWorkerCompletedイベント
は,GUIスレッド側で動くので,Control.Invokeも不要になるというおまけのメリットも
あります。
レス、ありがとうございます。
難しそうですが、勉強してみます。
別スレッドを作成してDelegate、Invokeでとりあえず解決しましたので、いったんクロー
ズとさせていただきます。ありがとうございました。