我做的功能是
1、截取当前场景生成一张图片
2、弹出一个有PictureBox的窗体显示这张图片。
图片生成时间大概1秒左右,所以窗体已经弹出了,图片却没有生成完,PictureBox中不会显示图片
我用以下代码循环判断图片是否已经输出
这时弹出错误说“无限递归或无限循环”,以前有人教我在VS 调试-->异常 中勾选某项就可以避免弹出这个错误了,可是我忘了,
请问 怎么改善代码避免这种错误,或是怎么设置VS让它不再捕捉这个错误?
------解决思路----------------------
可以使用backgroundWorker 组件,在它的dowork中执行你的加载图片操作,在它的RunWorkerCompleted完成事件中 show你的form。
------解决思路----------------------
可以使用 FileSystemWatcher
FileSystemWatcher fileWatcher = new FileSystemWatcher
{
Filter = filename,
Path = path,
};
fileWatcher.Created += (sender, e) =>
{
//....
};
fileWatcher.EnableRaisingEvents = true;
------解决思路----------------------
你的生成图片是在主线程还是工作线程做的?
如果是在工作线程,把
if (File.Exists(imagePath))
改成
SpinWait.SpinUntil(() => (File.Exists(imagePath)));
如果是在主线程,把
if (File.Exists(imagePath))
改成
await Task.Factory.StartNew(() => SpinWait.SpinUntil(() => (File.Exists(imagePath))));
并在方法名前加async关键字
------解决思路----------------------
把递归改成while循环,无限递归会导致堆栈溢出
------解决思路----------------------
我一般是先弹出页面,然后页面加载完成回调方法加载页面的图片。
------解决思路----------------------
我不确定你的代码是怎么写的 所以也不好说是什么原因
用FileSystemWatcher 的思路是就是
监控在指定目录是否有文件被创建出来 ,如果有文件就说明你的截图已经完成了,这样就可以继续了
------解决思路----------------------
程序启动后,用个线程来检测文件
private void LoadImage()
{
Label lb1 = new Label();
lb1.Text = "正在读取图片";
lb1.Location = new Point(100, 100);
this.Controls.Add(lb1);
PictureBox pb = new PictureBox();
this.Controls.Add(pb);
Thread th = new Thread(() =>
{
int tick = 0;
while (tick < 100) //尝试100次
{
if (File.Exists("you file Path"))
{
this.Invoke(new MethodInvoker(() =>
{
Image img = Image.FromFile("path");
pb.Image = img;
}));
break;
}
Thread.Sleep(100);
}
this.Invoke(new MethodInvoker(() =>
{
lb1.Text = "读取文件失败";
}));
});
th.IsBackground = true;
th.Start();
}