掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
UDPで受信しながらデータをファイルへ保存するには? (ID:141341)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 保存するタイミングは遅れても良い)することを考えています。 試していませんが、受信と保存を分けるなら、.ReportProgress(0, rcvBytes) などとして、 追記保存処理をメインスレッド側の ProgressChanged に追い出してみては如何でしょう。 > ADODB.Streamを使ったのは簡単にバイト配列をRead, Writeできる COM のマーシャリングが発生するので避けてください。 Marshal.ReleaseComObect する手間もかけねばなりませんし。 読み書き可能なバイナリストリームが目的なら、MemoryStream が使えるかと。 > コードは以下のようにしました。 DoWork の中で、フィールド変数にアクセスするのは避けてください。 e.Argument / e.Result へのアクセスであれば構いませんけれども。 > Do > ReceiveData() > Loop While (1) それだと、Option Strict On の時にエラーになりますよ。 無限ループを行うつもりであるならば、脱出条件は不要なので Do ReceiveData() Loop のように記述してやれば OK です。 とはいえ、これでは何時までたっても RunWorkerCompleted になりませんよね。 もし、外部から bgWorker1.CancelAsync() された時にのみ終了とするのであれば、 脱出条件を「Until .CancellationPending」にすることができます。 > 上書きされてパケットが少なくなったのだと推測しています。 > これを避けるには、ファイル保存中にも受信できるようにする必要があると考えています。 推測が正しいか間違っているかの論議はともかく、受信と保存とを分けたいのであれば、 「一時保存用バッファ」と「書き込み用ストリーム」は分けねばならないでしょう。 (保存作業中にデータが追加された場合は、次回の書き込みに回さねばならないので) 今は rcvBytes が一時バッファになってはいますが、受信スレッドで同期書き込みを 行っているため、あまり意味が無いような気がします。先に書いたような方法で、 保存部分だけをメインスレッドに委ねるか、または BeginWrite などで、 保存処理を別のワーカースレッドに回してみてはいかがでしょう。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.