1

こんにちはみんな私はそのような構造を持っています: スレッドを開始します:

 Thread[] thr;
    int good_auth, bad_auth, good_like, bad_like;
    static object accslocker = new object();
    static object limitlocker = new object();
    string acc_path, proxy_path, posts_path;
    int position_of_limit, position = 0;
    private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        button2.Enabled = true;
        decimal value = numericUpDown1.Value;
        int i = 0;
        int j = (int)(value);
        thr = new Thread[j];
        for (; i < j; i++)
        {
            thr[i] = new Thread(new ThreadStart(go));
            thr[i].IsBackground = true;
            thr[i].Start();
        }
    }

そして関数よりも行く:

    public void go()
    {
        while (true)
        {
            string acc = "";
            string proxy = "";

            lock (limitlocker)
            {
                if (position_of_limit >= int.Parse(textBox2.Text) - 1)
                {
                    position_of_limit = 0;
                    if (position < posts.Count - 1)
                        position++;
                    else
                    {
                        break;
                    }
                }

            } 
            lock (accslocker)
            {
                if (accs.Count == 0)
                {
                    break;
                }
                else
                    acc = accs.Dequeue();
            }
            OD od = new OD(acc);
            string login = od.Auth();
            if (login == "Login")
            {
                lock (accslocker)
                {
                    good_auth++;
                    log_good_auth(good_auth);
                }

                string like = od.like(posts[position], textBox1.Text);
                if (like == "Good")
                {
                    lock (accslocker)
                    {
                        position_of_limit++;
                        good_like++;
                        log_good_like(good_like);
                    }
                }
                else if (like == "Failed")
                {
                    lock (accslocker)
                    {
                        bad_like++;
                        log_bad_like(bad_like);
                    }
                }
                else
                {
                    lock (accslocker)
                    {
                        bad_like++;
                        log_bad_like(bad_like);
                    }
                }

            }
            else if (login == "Spamblock")
            {
                lock (accslocker)
                {
                    bad_auth++;
                    log_bad_auth(bad_auth);
                }
            }
            else if (login == "Locked")
            {
                lock (accslocker)
                {
                    bad_auth++;
                    log_bad_auth(bad_auth);
                }
            }
            else if (login == "Invalid")
            {
                lock (accslocker)
                {
                    bad_auth++;
                    log_bad_auth(bad_auth);
                }
            }
            else if (login == "Bad_proxy")
            {
                lock (accslocker)
                {
                    accs.Enqueue(acc);
                    Proxy.proxies.Remove(proxy); 
                }
            }
            else
            {
                lock (accslocker)
                {
                    accs.Enqueue(acc);
                    Proxy.proxies.Remove(proxy);
                }
            }
        }
    }

たとえば、position_of_limit が int.Parse(textBox2.Text) - 1 よりも大きくなると、20 個のスレッドを開始します。すべてのスレッドは、次のループで次の post[position] を取得する必要があります。しかし、 = od.like(posts[position], textBox1.Text); のような行文字列で例外を受け取ります。

"Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index"

この問題を解決するには?ありがとう

4

1 に答える 1

0

STA スレッドであるため、GUI スレッドをロックすることは悪です。つまり、メッセージ ループを管理する必要があり、ブロックすることはできません。そのため、ブロッキングによってデッドロックが発生する可能性があります。

むしろ、次のようなコールバックを使用しますBackgroundWorker.RunWorkerCompleted.

ロックに関するその他の有益なリンク:

于 2013-07-10T20:59:26.803 に答える