开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7092|回复: 3
收起左侧

[C#作业] 第四十三天

[复制链接]
发表于 2019-5-29 14:08:43 | 显示全部楼层 |阅读模式   广东省揭阳市

今日主要学习内容**

43.1 综合实例 - Http代理采集验证系统-插件模式 编写并发验证类 -生产者消费者  任务进度 - 为什么多线程仍然会卡UI线程
43.2 综合实例 - Http代理采集验证系统-插件模式 加入线程安全缓冲队列 解决并发事件触发频繁卡死UI线程的问题

今日作业

  1. 在多线程验证代理类中尝试使用非时间控制的缓冲队列?
结帖率:100% (1/1)
发表于 2019-8-18 20:41:06 | 显示全部楼层   江苏省南京市
void Run () {
    ProxyInfo p;
    while (true) {
        if (proxyQueue.TryDequeue (out p)) {
            Task.Factory.StartNew (async (o)=>{
                Proxylnfo info = o as Proxylnfo;
                HttpClientHandler handler = new HttpClientHandler ();
                handler.UseProxy = true;
                handler.Proxy = new WebProxy (info.Ip, info.port);
                HttpClient client = new HttpClient (handler);
                client.Timeout = new TimeSpan (0, 0, 0, 5); //代理连接不上 代理可以连接上 连接不上百度 超时
                client.DefaultRequestHeaders.Add ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
                client.DefaultRequestHeaders.Add ("Accept", "*/*");
                try {
                    string rel = await client.GetStringAsync ("http://www.baidu.com");
                    if (rel.Contains ("京公网安备11000002000001号")) {
                        p.state = true;
                    }
                }catch (Exception ex) {
                    Console.WriteLine (ex);
                } finally {
                    //很重要必须要处理,不然资源会直接爆掉
                    client.Dispose ();
                    handler.Dispose ();
                    //ProxyVerifCompleteSuccess?.Invoke(info);
                    successQueue.Enqueue (info);
                }
            }, p);
        }else {
            sendToUI ();
        }
        if (successQueue.Count >= 20) {
            sendToUI ();
        }
        Thread.Sleep (200);
    }
}

private void sendToUI () {
    ProxyInfo info = new ProxyInfo ();
    List<ProxyInfo> plist = new List<ProxyInfo> ();
    while (successQueue.TryDequeue (out info)) {
        plist.Add (info);
    }
    ProxyVerifyCompleteSuccess?.Invoke (plist);
}

回复 支持 反对

使用道具 举报

发表于 2019-8-6 18:16:07 | 显示全部楼层   湖南省长沙市

英语太差了,最近还得恶补音标单词,不过学习起来很有意思,玩游戏一样,期待郭老师后面的模拟 数据库各类课程,老师注意身体。

void Run () {
    ProxyInfo p;
    while (true) {
        if (proxyQueue.TryDequeue (out p)) {
            Task.Factory.StartNew (async (o) => {
                Proxylnfo info = o as Proxylnfo;
                HttpClientHandler handler = new HttpClientHandler ();
                handler.UseProxy = true;
                handler.Proxy = new WebProxy (info.Ip, info.port);
                HttpClient client = new HttpClient (handler);
                client.Timeout = new TimeSpan (0, 0, 0, 5); //代理连接不上 代理可以连接上 连接不上百度 超时
                client.DefaultRequestHeaders.Add ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
                client.DefaultRequestHeaders.Add ("Accept", "*/*");

                try {
                    string rel = await client.GetStringAsync ("http://www.baidu.com");
                    if (rel.Contains ("京公网安备11000002000001号")) {
                        p.state = true;
                    }
                    else {

                    }
                }
                catch (Exception ex) {

                    Console.WriteLine (ex);
                } finally {
                    //很重要必须要处理,不然资源会直接爆掉
                    client.Dispose ();
                    handler.Dispose ();
                    //ProxyVerifCompleteSuccess?.Invoke(info);
                    successQueue.Enqueue (info);
                }
            }, p);
        }
        else {
            sendToUI ();
        }

        if (successQueue.Count >= 20) {
            sendToUI ();
        }
        Thread.Sleep (200);
    }
}

private void sendToUI () {
    ProxyInfo info = new ProxyInfo ();
    List<ProxyInfo> plist = new List<ProxyInfo> ();
    while (successQueue.TryDequeue (out info)) {
        plist.Add (info);
    }
    ProxyVerifyCompleteSuccess?.Invoke (plist);
}

评分

参与人数 1好评 +1 精币 +20 收起 理由
老郭 + 1 + 20 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2019-5-30 13:36:57 | 显示全部楼层   河南省郑州市
在多线程验证代理类中尝试使用非时间控制的缓冲队列?

思路: 1、在每次验证结束后,Thread.Sleep(100); 前,判断successQueue.Count>=10  成立的话把当前已经验证的sendToUI
           2、在全部结束后,也就是 if (proxyQueue.TryDequeue(out p))的else里面也把当前已经验证的sendToUI(留下的不够10的部分)

        void Run() {
            ProxyInfo p;
            while (true)
            {
                if (proxyQueue.TryDequeue(out p))
                {
                    略。。同课堂代码
                }
                else {
                    sendToUI();
                }
               
                //Console.WriteLine(successQueue.Count);
                if (successQueue.Count>=10) {
                    sendToUI();
                }
                Thread.Sleep(100);
            }
        }


        private void sendToUI() {
            ProxyInfo info = new ProxyInfo();
            List<ProxyInfo> plist = new List<ProxyInfo>();
            while (successQueue.TryDequeue(out info))
            {
                plist.Add(info);
            }
            ProxyVerifyCompleteSuccess?.Invoke(plist);
        }

评分

参与人数 1好评 +1 精币 +10 收起 理由
老郭 + 1 + 10 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表