-1

アプリに問題があります。1 スレッドでは問題なく動作しますが、スレッド > 1 に変更すると正しく動作しません。

私は3つのリストを持っています:

List<string> urls = new List<string>();
List<string> passwords = new List<string>();
    struct Proxy
    {
        public static List<string> proxies = new List<string>();
        public static string type;
    }

そして、すべてのスレッドが最初の URL を取得し、すべてのスレッドが最初のプロキシを取得し、各スレッドがリストから unik(next) パスワードを取得する必要があります。最初の 5 つのスレッドが 5 つのパスワードを受け取る場合、プロキシは次のスレッドに変更され、これらのスレッドは次の 5 つの固有のパスを受け取ります。これを解決するには?

    Thread[] thr;
    static object locker = new object();
    int good_auth, bad_auth, j;

    private void button1_Click(object sender, EventArgs e)
    {
        decimal value = numericUpDown2.Value;
        int i = 0;
        int k = (int)(value);
        thr = new Thread[k];
        for (; i < k; i++)
        {
            thr[i] = new Thread(new ThreadStart(go));
            thr[i].IsBackground = true;
            thr[i].Start();
        }
    }

    public void go()
    {
        string urlANDlogin = "";
        for (int url_index = 0; url_index < urls.Count; url_index++)
        {
            urlANDlogin = urls[url_index];
            string proxy = "";
            string password = "";

            if (Proxy.proxies.Count != 0)
            {
                if (checkBox1.Checked)
                    Proxy.type = "http";
                else if (checkBox2.Checked)
                    Proxy.type = "socks5";
                else
                    Proxy.type = "none";
            }


            VB vb = new VB(urlANDlogin, Proxy.type);
            for (int proxy_index = 0; proxy_index < Proxy.proxies.Count; proxy_index++)
            {
                lock (locker)
                {
                    if (Proxy.proxies.Count == 0)
                    {
                        break;
                    }
                    else
                        proxy = Proxy.proxies[proxy_index];
                }
                vb.Proxy(proxy);
                for (int i = 0; i < 5; i++)
                {
                    lock (locker)
                    {
                        if (passwords.Count == 0)
                        {
                            break;
                        }
                        else
                        {
                            password = passwords[j];
                            j++;
                        }
                    }
                    string login = vb.Auth(password);
                    if (login == "Good")
                    {
                        lock (locker)
                        {
                            good_auth++;
                            log_good(good_auth);
                        }
                        break;
                    }
                    else
                    {
                        lock (locker)
                        {
                            bad_auth++;
                            log_bad(bad_auth);
                        }
                    }                            

                }
                lock (locker)
                {
                    log_left_proxy(Proxy.proxies.Count);
                    j = 0;
                }
            }
        }
    }
4

1 に答える 1

1

TPL のデータ並列処理を使用することをお勧めします。

何かのようなもの:

Parallel.ForEach(urls, url => Process(url));

他のすべてのコメントに加えて、非 UI スレッドから Control にアクセスすることはできません。したがって、クリック メソッドでcheckBox1との値を取得する必要があります。checkBox2

于 2013-02-05T21:37:33.507 に答える