异常:确保没有进入无限循环或是无限递归

u011109659 2015-01-05 02:14:10
我做的功能是
1、截取当前场景生成一张图片
2、弹出一个有PictureBox的窗体显示这张图片。

图片生成时间大概1秒左右,所以窗体已经弹出了,图片却没有生成完,PictureBox中不会显示图片

我用以下代码循环判断图片是否已经输出


这时弹出错误说“无限递归或无限循环”,以前有人教我在VS 调试-->异常 中勾选某项就可以避免弹出这个错误了,可是我忘了,
请问 怎么改善代码避免这种错误,或是怎么设置VS让它不再捕捉这个错误?
...全文
783 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_25124293 2015-01-07
  • 打赏
  • 举报
回复
assky124 2015-01-06
  • 打赏
  • 举报
回复
程序启动后,用个线程来检测文件


        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();
        }
Jaye-L 2015-01-06
  • 打赏
  • 举报
回复
5楼说的对,如果图片不存在,你的程序就陷入死循环了
ghao0 2015-01-06
  • 打赏
  • 举报
回复
用do..while挺好
lkhuge 2015-01-06
  • 打赏
  • 举报
回复
引用 9 楼 u011109659 的回复:
[quote=引用 6 楼 lkhuge 的回复:] 可以使用 FileSystemWatcher
FileSystemWatcher fileWatcher = new FileSystemWatcher
 {
    Filter = filename,
    Path = path,
};
fileWatcher.Created += (sender, e) =>
{
    //....
 };

fileWatcher.EnableRaisingEvents = true;
请问为什么用这种方法弹出来的窗体是这样的: 像是没有完全初始化[/quote] 我不确定你的代码是怎么写的 所以也不好说是什么原因 用FileSystemWatcher 的思路是就是 监控在指定目录是否有文件被创建出来 ,如果有文件就说明你的截图已经完成了,这样就可以继续了
flien1 2015-01-05
  • 打赏
  • 举报
回复
引用 2 楼 gzxpg 的回复:
你应该换个思路,生成图片后然后弹出。
我一般是先弹出页面,然后页面加载完成回调方法加载页面的图片。
u011109659 2015-01-05
  • 打赏
  • 举报
回复
引用 7 楼 phommy 的回复:
你的生成图片是在主线程还是工作线程做的? 如果是在工作线程,把 if (File.Exists(imagePath)) 改成 SpinWait.SpinUntil(() => (File.Exists(imagePath))); 如果是在主线程,把 if (File.Exists(imagePath)) 改成 await Task.Factory.StartNew(() => SpinWait.SpinUntil(() => (File.Exists(imagePath)))); 并在方法名前加async关键字
好遗憾,await和asynchronous好像4的版本里没有。。。。。。
u011109659 2015-01-05
  • 打赏
  • 举报
回复
非常感谢楼上各位给出的建议,有些我不太明吧,容我摸索一下,明天再结贴!
u011109659 2015-01-05
  • 打赏
  • 举报
回复
引用 6 楼 lkhuge 的回复:
可以使用 FileSystemWatcher
FileSystemWatcher fileWatcher = new FileSystemWatcher
{
Filter = filename,
Path = path,
};
fileWatcher.Created += (sender, e) =>
{
//....
};

fileWatcher.EnableRaisingEvents = true;




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


像是没有完全初始化
於黾 2015-01-05
  • 打赏
  • 举报
回复
把递归改成while循环,无限递归会导致堆栈溢出
phommy 2015-01-05
  • 打赏
  • 举报
回复
你的生成图片是在主线程还是工作线程做的? 如果是在工作线程,把 if (File.Exists(imagePath)) 改成 SpinWait.SpinUntil(() => (File.Exists(imagePath))); 如果是在主线程,把 if (File.Exists(imagePath)) 改成 await Task.Factory.StartNew(() => SpinWait.SpinUntil(() => (File.Exists(imagePath)))); 并在方法名前加async关键字
lkhuge 2015-01-05
  • 打赏
  • 举报
回复
可以使用 FileSystemWatcher
FileSystemWatcher fileWatcher = new FileSystemWatcher
 {
    Filter = filename,
    Path = path,
};
fileWatcher.Created += (sender, e) =>
{
    //....
 };

fileWatcher.EnableRaisingEvents = true;
feiniao0822 2015-01-05
  • 打赏
  • 举报
回复
如果图片不存在不就变成下面这样了吗?不就是死循环吗

private void ExportPicture_Load(Object sender,EventArgs e)
{
ExportPicture_Load(null,null)
}
exception92 2015-01-05
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
可以使用backgroundWorker 组件,在它的dowork中执行你的加载图片操作,在它的RunWorkerCompleted完成事件中 show你的form。
http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx
exception92 2015-01-05
  • 打赏
  • 举报
回复
可以使用backgroundWorker 组件,在它的dowork中执行你的加载图片操作,在它的RunWorkerCompleted完成事件中 show你的form。
害羞的大叔 2015-01-05
  • 打赏
  • 举报
回复
你应该换个思路,生成图片后然后弹出。
u011109659 2015-01-05
  • 打赏
  • 举报
回复
如果加上那句“System.Threading.Thread.Sleep(100);” 就不会再提示错误,但经常出现窗体弹出来却没有显示图片的现象。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧