Проверка URL-адресов из нескольких потоков и обновление DataGridView

Я пытаюсь проверить URL-адреса из нескольких потоков и обновить DataTable. Проверка работает нормально, когда используется один поток

Работает отлично - одна нить

foreach (string url in urllist)
{
Boolean valid = CheckURL(url);

this.Invoke((MethodInvoker)delegate()
{
if (valid)
{

dt.Rows[counter][2] = "Valid";
validcount++;
}
else
{

dt.Rows[counter][2] = statusCode;
invalidcount++;

}
counter++;

});
}

Но когда я пытаюсь сделать это, используя несколько потоков, некоторые допустимые URls сообщаются как недействительные, и наоборот.

Многопоточность - не работает

Parallel.ForEach(urllist, ProcessUrl);

private void ProcessUrl(string url)
        {
            Boolean valid = CheckURL(url);

            this.Invoke((MethodInvoker)delegate()
            {
            if (valid)
            {

                dt.Rows[counter][2] = "Valid";
                validcount++;


            }
            else
            {

                dt.Rows[counter][2] = statusCode;
                invalidcount++;

            }

                counter++;

            });
        }

Связанный метод и класс

 private  Boolean CheckURL(string url)
        {
 using (MyClient myclient = new MyClient())
            {
                try
                {
                    myclient.HeadOnly = true;
                    myclient.Headers.Add(HttpRequestHeader.UserAgent, "My app.");
                     //fine, no content downloaded
                    string s1 = myclient.DownloadString(url);
                    statusCode = null;
                    return true;
                }
                catch (WebException error)
                {
                    if (error.Response != null)
                    {
                        HttpStatusCode scode = ((HttpWebResponse)error.Response).StatusCode;
                        if (scode != null)
                        {
                            statusCode = scode.ToString();
                        }
                    }
                    else
                    {
                        statusCode = "Unknown Error"; 
                    }
                    return false;
                }
            }

        }



class MyClient : WebClient
        {
            public bool HeadOnly { get; set; }
            protected override WebRequest GetWebRequest(Uri address)
            {
                WebRequest req = base.GetWebRequest(address);

               req.Timeout = 10000;
                if (HeadOnly && req.Method == "GET")
                {
                    req.Method = "HEAD";
                }
                return req;
            }
        }

Что я делаю не так? Пожалуйста посоветуй..

ОБНОВИТЬ:

Как я начинаю задание ->

var ts = new CancellationTokenSource();
CancellationToken ct = ts.Token; 
Task.Factory.StartNew(() =>
{
 if (nameresfailcount > 10)
    {
    if (ct.IsCancellationRequested)
    {
    // another thread decided to cancel
    Console.WriteLine("task canceled");
    break;
    }
    }
//stuff 
},ct).ContinueWith(task =>
{
_benchmark.Stop();
}

0 ответов

Другие вопросы по тегам