Как зациклить proxyList и accountList с потоками, чтобы, пока прокси не был заблокирован, продолжалось тестирование учетных записей?

Во-первых, например, если количество потоков равно 5, проблема в том, что он начинает тестировать accountList с 4 вместо 0. Во-вторых: я получаю дубликаты последнего протестированного аккаунта.

Они определены так:

public partial class Form1 : Form
{    
    private static int g = 0;
    private static int v = 0;
    private static int r = 0;
    private static int w = 0;
    int globalCount = 0;
    int failCount = 0;
    int successCount = 0;
    int freeCount = 0;
    int banCount = 0;
    int retCount = 0;
    int unknownCount = 0;
    int proxyCount = 0;        
    int r = 0, g = 0, v = 0, w = 0;

    [ThreadStatic]
    private static bool BanProxy = false;
    [ThreadStatic]
    private static bool DontR = false;
    [ThreadStatic]
    private static bool Dont = false;
    [ThreadStatic]
    private static bool Retry = false;

    public static List<string> accountLst = new List<string>();
    public static List<string> proxyLst = new List<string>();

 private void Button2_Click(object sender, EventArgs e)
 {
    int tCount = Convert.ToInt32(textBox2.Text);
    if (checkBox1.Checked)
       LoadProxies();
    LoadAccounts();

    for (int i = 0; i < tCount; i++)
    {
         var th = new Thread(() => Worker());
         th.Start();
    }
 }

А вот рабочий, из которого, кажется, возникла проблема. Я перепробовал все, что мог придумать безрезультатно.

    public void Worker()
    {
        int j = Thread.CurrentThread.ManagedThreadId;
        while (v < accountLst.Count - 1)
        {
            if (!DontR)
            {
                proxyCount++;
                if (label7.InvokeRequired)
                    Invoke((MethodInvoker)(() => this.label7.Text = $"pCount : {proxyCount}"));
            }
            if (r == proxyLst.Count)
            {
                //Thread.Sleep(timetoretestproxylist);
                r = 0;
            }
            w = r;
            if (!DontR)
                r++;

            do
            {
                if (!Dont & !Retry)
                {
                     v = g;
                     g++;      
                }

                if (richTextBox2.InvokeRequired)
                    Invoke((MethodInvoker)(() => richTextBox2.AppendText($"v: {v}, thread: {j}" + "\n")));

                switch (Checker(accountLst[v], proxyLst[w]))
                {
                    case FAIL_KEY:
                        failCount++;
                        BanProxy = false;
                        if (label3.InvokeRequired)
                            Invoke((MethodInvoker)(() => label3.Text = $"Bad : {failCount}"));
                        break;
                    case SUCC_KEY:
                        successCount++;
                        BanProxy = false;
                        Invoke(new MethodInvoker(() =>
                        {
                            label1.Text = $"Success : {successCount}";
                            richTextBox1.AppendText(accountLst[v] + "\n");
                        }));
                        break;
                    case FREE_KEY:
                        freeCount++;
                        BanProxy = false;
                        if (label2.InvokeRequired)
                            Invoke((MethodInvoker)(() => label2.Text = $"Free : {freeCount}"));
                        break;
                    case BAN_KEY:
                        banCount++;
                        if (label4.InvokeRequired)
                            Invoke((MethodInvoker)(() => label4.Text = $"Ban : {banCount}"));
                        BanProxy = true;
                        break;
                    case RET_KEY:
                        retCount++;
                        Retry = true;
                        break;
                    default:
                        unknownCount++;
                        BanProxy = false;
                        if (label7.InvokeRequired)
                            Invoke((MethodInvoker)(() => label5.Text = $"Unknown : {unknownCount}"));
                        break;
                }

                if (Retry)
                {
                    DontR = true;
                    break;
                }

                if (BanProxy)
                {
                    Dont = true;
                    break;
                }

                globalCount++;
                Invoke((MethodInvoker)(() =>
                {
                    richTextBox2.AppendText(accountLst[v] + "\n");
                    label6.Text = $"Total : {globalCount}/{accountLst.Count}";
                }));

                DontR = false;
                Dont = false;

            } while (v < accountLst.Count - 1);

        }
    }

BanProxy и Retry выключены или включены в контролере.

Ответы