• C# 多线程、控制线程数提高循环输出效率


    C#多线程及控制线程数量,对for循环输出效率。

    虽然输出不规律,但是效率明显提高。

    思路:

    如果要删除1000条数据,只使用for循环,则一个接着一个输出。所以,把1000条数据分成seed段,每段10条数据。

    int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1;

    注:createCount.Value的值是具体输出数据的数量

    这里把数据分配给seed个线程去处理,每个线程只输出10个数据。

            int threadCountTmp = 0;//任务线程分派数
            private void btnCreate_Click(object sender, EventArgs e)
            {
                int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1;
    
                for (int i = 0; i < seed; i++)
                {
                    Thread threadTmp = new Thread(new ParameterizedThreadStart(TempOut));
                    threadTmp.Start(i);
                    threadCountTmp++;
                    Application.DoEvents();//响应窗口状态
                    while (true) { if (threadCountTmp < 10) break; }//推拉窗式控制多线程 线程数10
                }
    }
            //分段后的数据发布给其它线程
            public void TempOut(object o)
            {
                int tmp=Convert.ToInt32(o)*10;
                int i = tmp;
                for (; i < (tmp+10<=createCount.Value?tmp+10:createCount.Value); i++)
                {
                    Thread thread = new Thread(new ParameterizedThreadStart(ResultOut));
                    thread.Start(i);
                    threadCount++;
                    while (true) { if (threadCount < 10) break; }//推拉窗式控制多线程   线程数10
                }
                threadCountTmp--;
            }

    分段后,再将分段后的数据分配给其它线程来处理,这样就能多线程同时工作了,由于要对控件操作,所以使用多线程的话要依靠委托来实现多线程对控件的控制。所以最后一步的输出,如下:

            delegate void TextTmp(object o);//声明委托
            int threadCount = 0;//任务线程
            //委托函数
            public void ResultOut(object o)
            {
                if (!txtResult.InvokeRequired)
                {
                    txtResult.Text = "\n" + f_groundcode.Text + "," + f_ticketno.Text + DateTime.Now.ToLongDateString().Replace("-", "") + GetZero(6 - o.ToString().Length) + o.ToString() + "," + DateTime.Now.ToLongDateString().Replace("-", "") + DateTime.Now.ToLongTimeString().Replace(":", "") + txtResult.Text;
                }
                else
                {
                    TextTmp tmpDel = new TextTmp(ResultOut);
                    this.Invoke(tmpDel,o);
                }
                threadCount--;
            }

    因为我的数据要保证位数,所以要对0做简单处理。例如 我要输出

    000000

    000001

    000002

    000003

    ........

    从上面的代码可以看出,我是使用for来递增的。所以是整型,前面的0随着数值的大小不断改变个数。

            //处理数字前面有多少个0
            private string GetZero(int leng)
            {
                string result = "";
                for (int i = 0; i < leng; i++)
                {
                    result += "0";
                }
                return result;
            }

    好了。简单的多线程处理。希望大家可以学习。欢迎大家指导~~

  • 相关阅读:
    织梦CMS去广告方法 for DedeCMS V5.7
    织梦网站底部的Power by DedeCms怎么去掉?
    java环境变量最佳配置
    HTML课上小结
    PHP四个阶段目标以及第一阶段学习内容
    例子:选项卡和进度条
    例子:轮播效果
    例子:下拉列表
    document对象操作:浏览器页面文件
    Windows对象操作:浏览器窗口信息
  • 原文地址:https://www.cnblogs.com/StupidsCat/p/2807503.html
Copyright © 2020-2023  润新知