ThreadPool并显示信息而不会形成冻结

时间:2014-02-27 16:35:40

标签: c# multithreading

我有一个问题。在我的项目中,我需要超过100个线程,这就是我更喜欢使用ThreadPool的原因。这是代码的一部分,但在这种情况下,我有很多内存使用,我的形式是非常滞后的,因为很多BeginInvoke调用(我想)。 有没有解决这个问题的方法?

  public void launch()
    {
        while (data.Count > 0)
        {
            string[] part;
            if (data.Count> 1000)
            {
                part = data.Take(1000).ToArray();
                data = data.Skip(1000).ToList();
            }
            else
            {
                part = data.Take(data.Count).ToArray(); data = data.Skip(1000).ToList();
            }
            foreach (var input in part)
            {
                try
                {
                    char splitter = ':';
                    if (input.Contains(';')) splitter = ';';
                    string login = input.Split(splitter)[0];
                    string pass = input.Split(splitter)[1];
                EncryptCore ec = new EncryptCore(new byte[15]);
                PacketSend ps = new PacketSend(ec, "");
                ps._login = login;
                ps._password = pass;
                ps.Brutted+=ps_Parsed;
                ps.Failed+=ps_Failed;
                ThreadPool.QueueUserWorkItem(ps.Parse);
                }
                catch { Interlocked.Increment(ref curr); }


            }
            Thread.Sleep(1000);

        }
        data.Clear();
    }

 private void ps_Brutted(User Account)
    {
        toGet.Add(Account);
        Interlocked.Increment(ref good);
        goodLabl.BeginInvoke(new Action(delegate()
        {
            goodLabl.Text = "Good: " + good;
        }));
      Update();
    }
private void Update()
    {
        try
        {
            Interlocked.Increment(ref curr);

            progLabel.BeginInvoke(new Action(delegate()
            {
                progLabel.Text = (double.Parse(curr.ToString()) / double.Parse(max.ToString())).ToString("#%");
            }));
            progressBar.BeginInvoke(new Action(delegate()
            {
                progressBar.Text = (double.Parse(curr.ToString()) / double.Parse(max.ToString()) * 100).ToString("#");
            }));
            checkedLabl.BeginInvoke(new Action(delegate()
            {
                checkedLabl.Text = "Checked: " + curr + " / " + max;
            }));
        }
        catch { }


    }

1 个答案:

答案 0 :(得分:0)

因此,您有数千个任务,每次完成其中一个任务,您可以通过在UI线程上安排4个更新来更新UI。您可能会考虑做的是根据正在更新的整数,在基于计时器的计划(尝试100毫秒或200毫秒)上进行UI更新。

除此之外,你还有一些奇怪的数字操作正在进行中。您只需将int投射到double,就不必往返String