Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2011, 03:09   #1
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость Проблема с POST - запросом

ообщем есть 10 потоков, задача каждого потока - послать пост запрос, тойсть в результате должно выполниться 10 пост запросов, у меня почему то выполняеться только 2 пост запроса

Создаем и запускаем 10 потоков
Код:
Thread[] th = new Thread[10];
 
 for (int i = 0; i < 10; i++)
 {
     th[i] = new Thread(new ParameterizedThreadStart(my.post));
     th[i].SetApartmentState(ApartmentState.STA);
     th[i].Start(str);
 }

Метод post
Код:
public void post(Object obj)
        {
 
            myStr m = (myStr)obj;
 
            String postData = "login=" + m.login + "&passwd=" + m.pass + Thread.CurrentThread.ManagedThreadId.ToString();
            byte[] Bytes = Encoding.Default.GetBytes(postData);
            string AdditionalHeaders = "Content-Type: application/x-www-form-urlencoded" + Environment.NewLine;
 
            WebBrowser webBrowser1 = new WebBrowser();
 
            webBrowser1.Navigate("http://mysite.net/log.php", "", Bytes, AdditionalHeaders);
 
}
Все отрабатывает хорошо, но почему только 2 пост запроса ???? их должно быть 10!
Я открываю свой http://mysite.net/log.php и вижу только 2 строки.....
Lemo вне форума Ответить с цитированием
Старый 03.08.2011, 11:52   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

После запуска добавьте еще один цикл (насколько я понял, у вас видимо консольное приложение?)
Код:
for (int i = 0; i < th.Length; i++)
	{
	    th[i].Join();
	}
Внимательно читаем как работать с потоками. Если кратко, то просто ваша машина успевает отработать два потока, пока остальные 8 стартуют, после чего приложение завершает главный поток, и завершается полностью, что и прерывает остальные потоки.
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2011, 11:56   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Попробуйте сделать задержку между созданием потоков в 1-2 секунды.Если все запросы пройдут,тогда, возможно, есть проблемы синхронизации или еще какие-кто меж этнические конфликты..))
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 03.08.2011, 13:28   #4
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
По умолчанию

Попробывал Join() вообще тупо виснет прога и все, и не одного запроса
Thread.Sleep(); тоже юзал, итог 0.
Lemo вне форума Ответить с цитированием
Старый 03.08.2011, 13:34   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Lemo Посмотреть сообщение
Попробывал Join() вообще тупо виснет прога и все, и не одного запроса
Thread.Sleep(); тоже юзал, итог 0.
"Прога" не "тупо виснет", а главный (управляющий, родительский) поток ожидает завершения (выполнения) потока, вызвавшего Join(). В это же время все потоки выполняются успешно, таким образом, циклически, мы получаем возможность удостовериться в том, что каждый поток завершился (успешно или нет, это уже другое дело), и что мы можем завершить (спокойно) главный поток.
Другое дело, что вполне вероятно у вас может вылетать Exception в теле потока. Оберните код потока в try {} catch (Exception e) { } и поставьте break point на catch, может словите свой Exception e и как раз посмотрите что не так.

UPD:
Еще раз предлагаю внимательно почитать примеры и документацию по работе с потоками в C#.
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2011, 13:41   #6
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
"Прога" не "тупо виснет", а главный (управляющий, родительский) поток ожидает завершения (выполнения) потока, вызвавшего Join(). В это же время все потоки выполняются успешно, таким образом, циклически, мы получаем возможность удостовериться в том, что каждый поток завершился (успешно или нет, это уже другое дело), и что мы можем завершить (спокойно) главный поток.
Другое дело, что вполне вероятно у вас может вылетать Exception в теле потока. Оберните код потока в try {} catch (Exception e) { } и поставьте break point на catch, может словите свой Exception e и как раз посмотрите что не так.

UPD:
Еще раз предлагаю внимательно почитать примеры и документацию по работе с потоками в C#.
Оно вообще не заходит ни в один из 10 потоков... я пишу логи
Lemo вне форума Ответить с цитированием
Старый 03.08.2011, 13:42   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Lemo Посмотреть сообщение
Оно вообще не заходит ни в один из 10 потоков... я пишу логи
Хорошо, может я вас дезинформирую, дайте попробую написать вариант.

UPD:
Как вариант выполнения POST запроса на .NET 2.0.
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Net;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Thread> threadList = new List<Thread>();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Starting...#{0}", i);
                Thread thread = new Thread(new ParameterizedThreadStart((number) =>
                {
                    try
                    {
                        // Do what you'r going to do...
                        /*HttpPost.Execute("http://mysite.net/log.php", new NameValueCollection()
                            {
                                {"name1", "value1"},
                                {"name2", "value2"},
                                {"name3", "value3"}
                            });*/

                        Thread.Sleep(1000);

                        Console.WriteLine("Complete: #{0}", number);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Error: #{0} {1}", number, e.Message);
                    }
                }));
                threadList.Add(thread);
                thread.Start(i);
            }
            foreach (Thread thread in threadList)
            {
                thread.Join();
            }
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        private static class HttpPost
        {
            public static string Execute(string url, NameValueCollection parameters)
            {
                return Execute(new Uri(url), parameters);
            }

            public static string Execute(Uri uri, NameValueCollection parameters)
            {
                StringBuilder parametersString = new StringBuilder();
                if (parameters != null)
                {
                    for (int i = 0; i < parameters.Count; i++)
                    {
                        if (i > 0)
                        {
                            parametersString.Append("&");
                        }
                        parametersString.AppendFormat("{0}={1}", parameters.GetKey(i), Uri.EscapeDataString(parameters[i]));
                    }
                }

                System.Net.ServicePointManager.Expect100Continue = false;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                using (StreamWriter requestWriter = new StreamWriter(request.GetRequestStream()))
                {
                    requestWriter.Write(parametersString.ToString());
                }

                using (WebResponse response = request.GetResponse())
                {
                    using (StreamReader responseReader = new StreamReader(response.GetResponseStream()))
                    {
                        return responseReader.ReadToEnd();
                    }
                }
            }
        }
    }
}

Последний раз редактировалось BOBAH13; 03.08.2011 в 14:02.
BOBAH13 вне форума Ответить с цитированием
Старый 03.08.2011, 13:49   #8
Lemo
Форумчанин
 
Аватар для Lemo
 
Регистрация: 13.10.2008
Сообщений: 714
Радость

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Хорошо, может я вас дезинформирую, дайте попробую написать вариант.
К примеру если юзать такой код (БЕЗ ДЖОИНА)
Код:
            Thread[] th = new Thread[10];
            myStr str = new myStr(textBox1.Text, textBox2.Text);

            for (int i = 0; i < 10; i++)
            {
                my.Ilog.WriteLog("Пробегаемся по циклу : " + i.ToString(),textBox3);
                th[i] = new Thread(new ParameterizedThreadStart(my.post));
                th[i].SetApartmentState(ApartmentState.STA);
                th[i].Start(str);
  
            }
Лог
Код:
08.03 12:47:31> Вышли в метод post - ID : 17
08.03 12:47:31> Вышли в метод post - ID : 16
08.03 12:47:31> Зашли в метод post - ID : 19
08.03 12:47:31> Пробегаемся по циклу : 9
08.03 12:47:31> Пробегаемся по циклу : 8
08.03 12:47:31> Пробегаемся по циклу : 7
08.03 12:47:31> Пробегаемся по циклу : 6
08.03 12:47:31> Пробегаемся по циклу : 5
08.03 12:47:31> Пробегаемся по циклу : 4
08.03 12:47:31> Пробегаемся по циклу : 3
08.03 12:47:31> Пробегаемся по циклу : 2


=================

С Джоином
Код:
  Thread[] th = new Thread[10];
            myStr str = new myStr(textBox1.Text, textBox2.Text);

            for (int i = 0; i < 10; i++)
            {
                my.Ilog.WriteLog("Пробегаемся по циклу : " + i.ToString(),textBox3);
                th[i] = new Thread(new ParameterizedThreadStart(my.post));
                th[i].SetApartmentState(ApartmentState.STA);
                th[i].Start(str);
                th[i].Join();
               
            }
Лог
Код:
08.03 12:47:31> Пробегаемся по циклу : 0
и все + ниодного запроса не прошло
Lemo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Post запросом DKENT Работа с сетью в Delphi 1 16.02.2011 16:34
Проблема с post запросом! DKENT Работа с сетью в Delphi 1 12.10.2010 17:28
Проблемы с POST запросом через cURL LonRv PHP 0 28.12.2009 17:56
Проблемы с POST запросом... JustKurt Работа с сетью в Delphi 1 26.07.2009 01:02
Отправка файла POST-запросом на PHP-скрипт... ActiveX Работа с сетью в Delphi 7 20.07.2009 16:54