解决多线程产生的“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”
2008-12-13 16:54
423 查看
今天下载漫画,结果VeryCD上有人只发布了Vol1和Vol2,后面就烂尾了。没办法,去在线看吧,要慢慢等网页加载好,还得看广告。所以就自己做了一个漫画下载者。
在多线程下载类中,我定义了一个DownloadFinished事件,并将下载信息都返回出去。但是主窗体接受到这个事件后什么都没执行,下了断点之后发现我传进来的参数都变成了“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”。
经过多方查证,终于发现了问题。大家先看我原来错误的代码:
Code
class FileDownloader:IDisposable
{
Thread t;
DownloadInfo _dInfo;
public delegate void DownLoadFinish(object sender, object Params);
public event DownLoadFinish DownLoadFinished;
WebClient wClient = new WebClient();
public void StartDownLoad(object dlInfo)
{
t.Start(dlInfo);
}
private void DownLoadImage(object dlInfo)
{
DownloadInfo dInfo = dlInfo as DownloadInfo;
this._dInfo = dInfo;
Uri ui = new Uri(dInfo.url);
wClient.DownloadFile(ui, dInfo.SavePathWithFileName);
Delegate []d=DownLoadFinished.GetInvocationList();
if (d.Length>0)
{
DownLoadFinished(this, _dInfo);
}
GetAThread();
}
FileDownLoader是一个类,要想使用StartDownLoad启动线程下载,一定要先实例化一个FileDownLoader变量,而这个变量是存在于主线程的,这话隐含着_dInfo也是包含在主线程中的。再看看新的DownLoadImage方法。完成事件传入的参数不再是线程内的局部变量ui,而是在主线程中实例化好的DownLoadInfo类型的_dInfo变量。这样线程t被销毁时ui被销毁,但是在主函数中存在的_dInfo是不会被销毁的。这样就不会产生”以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值“的问题了。
本来想把漫画下载器放出来给大家下载的,但是这样对那个网站相当不利,毕竟人家也是要赚钱的。而且一旦放出来,人家肯定会出更BT的加密算法,我下次就要重新编写算法才能下载了。所以有需要的可以留言,我会把源代码发给大家,但是这里就不贴出来了。
在多线程下载类中,我定义了一个DownloadFinished事件,并将下载信息都返回出去。但是主窗体接受到这个事件后什么都没执行,下了断点之后发现我传进来的参数都变成了“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”。
经过多方查证,终于发现了问题。大家先看我原来错误的代码:
Code
class FileDownloader:IDisposable
{
Thread t;
DownloadInfo _dInfo;
public delegate void DownLoadFinish(object sender, object Params);
public event DownLoadFinish DownLoadFinished;
WebClient wClient = new WebClient();
public void StartDownLoad(object dlInfo)
{
t.Start(dlInfo);
}
private void DownLoadImage(object dlInfo)
{
DownloadInfo dInfo = dlInfo as DownloadInfo;
this._dInfo = dInfo;
Uri ui = new Uri(dInfo.url);
wClient.DownloadFile(ui, dInfo.SavePathWithFileName);
Delegate []d=DownLoadFinished.GetInvocationList();
if (d.Length>0)
{
DownLoadFinished(this, _dInfo);
}
GetAThread();
}
FileDownLoader是一个类,要想使用StartDownLoad启动线程下载,一定要先实例化一个FileDownLoader变量,而这个变量是存在于主线程的,这话隐含着_dInfo也是包含在主线程中的。再看看新的DownLoadImage方法。完成事件传入的参数不再是线程内的局部变量ui,而是在主线程中实例化好的DownLoadInfo类型的_dInfo变量。这样线程t被销毁时ui被销毁,但是在主函数中存在的_dInfo是不会被销毁的。这样就不会产生”以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值“的问题了。
本来想把漫画下载器放出来给大家下载的,但是这样对那个网站相当不利,毕竟人家也是要赚钱的。而且一旦放出来,人家肯定会出更BT的加密算法,我下次就要重新编写算法才能下载了。所以有需要的可以留言,我会把源代码发给大家,但是这里就不贴出来了。
相关文章推荐
- 由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值。
- 由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值。
- VS中单步调试时出现“由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值。”的问题。
- ODAC访问oracle时,提示:由于以前的函数求值超时,函数求值被禁用,必须继续执行才能正常返回
- 多线程委托函数中访问webbrowser 等UI窗体控件,报错“由于以前的函数求值超时,函数求值被禁用+用户已关闭隐式函数计算。”
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- phpMyAdmin必须启用Cookies 才能登录的解决办法
- 【转】关于phpMyAdmin "必须启用 Cookies 才能登录" 的解决办法
- 由于以前的函数求值超时,函数求值…
- "以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。"的解决办法
- 如何解决:执行CAD命令,原来选中的图元无效,必须重新选择一次的问题
- VS2010 "缺少dlmgr.dll 无法继续执行代码。重新安装程序可能会解决此问题"解决方案
- Mybatis偶遇“必须执行该语句才能获得结果”问题的解决办法
- js函数必须在alert某元素执行后才能执行
- “以前进行的程序安装创建了挂起的文件操作。运行程序之前,必须重新起动计算机。”的解决办法
- 关于phpMyAdmin "必须启用 Cookies 才能登录" 的解决办法
- [ASP.NET] 自定义控件的 onkeypress 在 javascript 函数返回false 依旧继续执行的解决方法(教训)
- PHP执行函数超时,执行数据库超时等问题解决方法(9元包邮)
- js函数必须在alert执行才能执行
- 关于phpMyAdmin必须启用 Cookies 才能登录 的解决办法