当前位置: 代码迷 >> C# >> 错误:确保没有进入无限循环或是无限递归
  详细解决方案

错误:确保没有进入无限循环或是无限递归

热度:63   发布时间:2016-05-05 05:15:39.0
异常:确保没有进入无限循环或是无限递归
我做的功能是
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循环,无限递归会导致堆栈溢出
------解决思路----------------------
引用:
你应该换个思路,生成图片后然后弹出。

我一般是先弹出页面,然后页面加载完成回调方法加载页面的图片。
------解决思路----------------------
引用:
Quote: 引用:

可以使用 FileSystemWatcher 
FileSystemWatcher fileWatcher = new FileSystemWatcher
 {
    Filter = filename,
    Path = path,
};
fileWatcher.Created += (sender, e) =>
{
    //....
 };

fileWatcher.EnableRaisingEvents = true;




请问为什么用这种方法弹出来的窗体是这样的:


像是没有完全初始化



我不确定你的代码是怎么写的 所以也不好说是什么原因
用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();
        }
  相关解决方案