• 关于线程执行耗时问题


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace new爬虫
    {
        public partial class 采集 : Form
        {
            public static 采集 main;
            public string resultToken;
            public static string content = "";
            public static int maxThread = 10;
            public static int minThread = 10;
    
            delegate void SetTextCallback(string text);
            
            public 采集()
            {
                InitializeComponent();
                this.richTextBox1.Text = "采集初始化成功.";
                this.textBox执行次数.Text = "100";
                this.textBox最大线程数.Text = "10";
                this.textBox最小线程数.Text = "10";
                Helper.fileToString();
                main = this;
    
            }
            /// <summary>
            /// 开始采集
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
    
                for (int i = 0; i < 1; i++)
                {
                    ThreadStart threadStart = new ThreadStart(upload);//通过ThreadStart委托告诉子线程执行什么方法  
                    Thread thread = new Thread(threadStart);
                    thread.Start();//启动新线程
                }
    
                #region 线程池测试
                //int min, max, count;
                //try
                //{
                //    min = int.Parse(this.textBox最小线程数.Text);
                //    max = int.Parse(this.textBox最大线程数.Text);
                //    count = int.Parse(this.textBox执行次数.Text);
                //}
                //catch { MessageBox.Show("数据格式输入非整数");return; }
                //ThreadPool.SetMinThreads(min, min);
                //ThreadPool.SetMaxThreads(max, max);
    
    
                //for (int i = 1; i <= int.Parse(this.textBox执行次数.Text); i++)
                //{
                //    ThreadPool.QueueUserWorkItem(new WaitCallback(upload), content);
                //}
                #endregion
            }
            /// <summary>
            /// 上传
            /// </summary>
            /// <param name="obj"></param>
            private static void upload(object obj)
            {
                httplogin.HttpHelper(obj.ToString());
              
    
            }
            private static void upload()
            {
                httplogin.HttpHelper("");
    
    
            }
    
    
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="info"></param>
            public void addLog(string info)
            {
                this.richTextBox1.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ") + info + "
    " + this.richTextBox1.Text;
            }
            public void SetText(string text)
            {
                //子线程睡眠1秒
                //Thread.Sleep(1000);
                if (this.richTextBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.richTextBox1.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss ") + text + "
    " + this.richTextBox1.Text;
                    this.richTextBox1.Refresh();
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                this.richTextBox1.Text = "";
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace new爬虫
    {
        public class httplogin
        {
            /// <summary>
            /// Token
            /// </summary>
            public static string Token;
            public static string url;
    
    
            /// <summary>
            /// 登录
            /// </summary>
            public static async void HttpHelper(string resultJson)
            {
                采集.main.SetText(Thread.CurrentThread.ManagedThreadId.ToString() + "号线程开启");
                Helper.AddLogMsg("上传线程开启时间", "当前线程号:" + Thread.CurrentThread.ManagedThreadId);
    
                //记录开始时间
    
                DateTime start= DateTime.Now;           
    
                HttpResponseMessage responseMessage = new HttpResponseMessage();
                HttpClient httpClient = new HttpClient();
    
                
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);
    
    
                HttpContent httpContent = new StringContent(resultJson);
                httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                string result = "";
                HttpResponseMessage httpResponseMessage = new HttpResponseMessage() ;
                try
                {
                    start = DateTime.Now;
                    httpResponseMessage = await httpClient.PostAsync(url, httpContent);
                    
                    if (httpResponseMessage != null && responseMessage.IsSuccessStatusCode && responseMessage.StatusCode == HttpStatusCode.OK)
                    {
                        result = "上传成功";
                        //成功的逻辑处理
                        //Helper.AddLogMsg("上传成功", "当前线程号:" + Thread.CurrentThread.ManagedThreadId);
    
                    }
                    else
                    {
                        result = "上传失败";
                        //Helper.AddLogMsg("上传失败", "当前线程号:" + Thread.CurrentThread.ManagedThreadId);
                    }
                   
                }
                catch {
                   /* Helper.AddLogMsg("上传失败", "当前线程号:" + Thread.CurrentThread.ManagedThreadId);*/ result = "上传失败";
                }
                finally
                {
                    httpResponseMessage.Dispose();
                    httpClient.Dispose();
                    responseMessage.Dispose();
                }
               //记录接触时间
                var interval = (DateTime.Now - start).TotalMilliseconds;
                采集.main.SetText(Thread.CurrentThread.ManagedThreadId.ToString() + "号线程结束  耗时: " + interval + "ms " + result+"  ");
                Helper.AddLogMsg("上传线程关闭时间", "当前线程号:" + Thread.CurrentThread.ManagedThreadId + " 
     耗时:" + interval + "ms 
     " + result + "
     url:"+ url);
            }
            /// <summary>
            /// 执行时间
            /// </summary>
            /// <returns></returns>
            //private static string dealTime()
            //{
    
            //}
        }
    }

    这是两个主要的逻辑代码  对于运行结果

    单线程

    线程池

    关于这个问题 我尝试用了穷举法看到底是什么地方出现了问题  

    有以下猜测

    1.关于单次执行耗时较少问题 不需要考虑cpu轮转执行片段切换线程 并且创建底层所需要的单例对象 所以第一次耗时相对单线程 较多

    2.对于线程池 第一次执行耗时较长 是因为 线程创建耗时 线程轮转切换耗时 底层创建单例静态资源块忽略(因为被哪一个线程执行 并不确定) 

    3.关于线程池里面的线程创建回收线程 是否保存当前线程块的资源 尚不确定(存在疑问 大佬可以帮忙解释一下)

    4.不存在线程池的回收线程的线程都将被销毁

    124已被猜想证实  3回收线程 尚未查到

  • 相关阅读:
    Bozh 的技术博客 梦想成为Gnu/Linux | Unix后台架构师 | Read the fucking source code
    Welcome to the TANGO website
    repowatcher : about
    PyTango documentation — PyTango 8.0.2 documentation
    Visual Studio 2010旗舰版正式版序列号 civilman的专栏 博客频道 CSDN.NET
    BoostPro Binary Installer for Visual C++
    分享:httping 1.5.6 发布,HTTP 诊断工具
    浅析epoll – epoll函数深入讲解 C++爱好者博客
    分享:Jython动态加载Jar
    News BoostPro Computing BoostPro
  • 原文地址:https://www.cnblogs.com/wangcl-8645/p/10598195.html
Copyright © 2020-2023  润新知