您的位置:首页 > 其它

解决多线程产生的“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”

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的加密算法,我下次就要重新编写算法才能下载了。所以有需要的可以留言,我会把源代码发给大家,但是这里就不贴出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐