我有一个C#WinForms应用程序,它使用AForge从文件流(fs)播放视频,这是使用字节数组(TheVideoInBytes)创建的。在视频流中创建视频后,它将使用“private void video_NewFrame”开始播放(private void tsbtnPlayPause_Click)。
以下是播放代码:
private void tsbtnPlayPause_Click(object sender, EventArgs e)
{
if (tsbtnPlayStop.Text == "▶")
{
try
{
TheVideoInBytes = Convert.FromBase64String(glbstrVideo);
System.IO.FileStream fs = new System.IO.FileStream("whatever", System.IO.FileMode.Create);
fs.Write(TheVideoInBytes, 0, TheVideoInBytes.Length);
videoSource.Source = "whatever";
videoSource.Start();
videoSource.PlayingFinished += VideoSource_PlayingFinished;
tsbtnPlayStop.Text = "█";
fs.Dispose();
fs.Close();
//videoSource.Source = ofd.FileName;
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
tsbtnCloseMedia.Enabled = tsbtnPlayStop.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
videoSource.SignalToStop();
tsbtnPlayStop.Text = "▶";
videoSource.Source = null;
System.IO.File.Delete("whatever");
}
}
...这里是框架的代码:
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
try
{
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
this.Invoke((MethodInvoker)delegate
{
pbVid.Image = bitmap;
pbVid.Refresh();
});
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
问题:如果在播放过程中关闭主窗体(frmMain_FormClosing(对象发送方,FormClosingEventArgs e)),应用程序将崩溃并显示以下消息:
System.IO.IOException未处理 的HResult = -2147024864 Message =进程无法访问该文件,因为它正由另一个进程使用。
System.ObjectDisposedException无法访问已处置的对象。
此错误发生在private void video_NewFrame中的此行:
this.Invoke((MethodInvoker)delegate
如何安全地删除此过程以及确切编写代码的位置?