前提・実現したいこと
キャプチャボードで画像をキャプチャし、それをPictureBoxで表示しようとしています。
発生している問題・エラーメッセージ
下記コードのCreateImage内のFileStreamのインスタンス作成のところでエラーが発生します。
System.IO.IOException HResult=0x80070020 Message=別のプロセスで使用されているため、プロセスはファイル 'D:\temp.bmp' にアクセスできません。 Source=mscorlib
該当のソースコード
C#
1 2private void Still() 3{ 4 StillSave(_tempBmpFileName, ImageFileFormat.Bitmap, 100); 5 6 /// ビットマップが完成するのを待つ 7 while (!System.IO.File.Exists(_tempBmpFileName)) 8 { 9 System.Threading.Thread.Sleep(100); 10 } 11 _pictureBox.Image = CreateImage(_tempBmpFileName); 12 } 13} 14 15private System.Drawing.Image CreateImage(string fileName) 16{ 17 System.Drawing.Image img = null; 18 using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) //ここで例外発生 19 { 20 img = System.Drawing.Image.FromStream(fs); 21 } 22 return img; 23} 24 25 26private void StillSave(string fullFileName, ImageFileFormat imageFormat, int jpegQuality) 27{ 28 /* 29 このメソッド内でキャプチャボードのAPI(アンマネージドDLL)の 30 画像キャプチャをしてBMPで保存する関数を呼び出します。 31 その関数の戻り値が成功の場合はそのまま処理が続き、 32 エラーの場合は例外を出すようにしています。 33 */ 34} 35 36
試したこと
BMPファイルが作成されるのを待ち、Sleepで暫く待つようにしていて、特に問題は起こっていなかったのですが、
最近導入したPCで上記エラーが起こるようになりました。
再現頻度がPCの電源投入後 初回に上記コードのところを通るときに起きやすいです(20回に1回くらい)
PCの電源を落とさずにソフトの再起動ではほぼ大丈夫なようです。
Sleepの時間を短くすれは頻繁に起こるので、長くすればとりあえずはしのげるとは思うのですが、根本的な解決ではないように思っています。
マネージドDLLでDisposeが実装されているのならば、usingで囲めばいいかと思うのですが、
今回のようなアンマネージドDLLの場合はどうやってリソースが解放されるのを知るのかがわかりません。
Sleep以外だと、例外を捕捉して数回リトライをする。くらいしか思いつきません。
他に方法があるようならご教示お願いいたします。
補足情報
Windows 10 64bit
Visual Studio 2019 Professional
C#
回答1件
あなたの回答
tips
プレビュー