#c# #multithreading #sockets
#c# #многопоточность #сокеты
Вопрос:
Я хотел написать программу, которая будет проверять прокси… Я хотел использовать многопоточность, но на самом деле не знаю, как применить это к моей программе:
int ktory = 0;
// Button to start multithreading
private void p_check_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i )
{
Thread th = new Thread(test_proxy);
CheckForIllegalCrossThreadCalls = false;
th.Start();
}
}
//This is my function to test proxies
private void test_proxy()
{
try
{
int ile = p_listbox.Items.Count;
string proxy = null;
//'ktory' - means position in listbox
proxy = p_listbox.Items[ktory].ToString();
ktory = 1;
//Splitting on IP and PORT
int gdzie = proxy.IndexOf(":");
string IP = proxy.Remove(gdzie);
string ipp = proxy.Replace(IP ":", "");
int PORT = Int32.Parse(ipp);
//end o splitting
//My testing of anonimty ( works good don`t need to check)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(p_proxyjudge.Text);
WebProxy adr_proxy = new WebProxy(IP, PORT);
adr_proxy.UseDefaultCredentials = true;
request.Proxy = adr_proxy;
request.Timeout = 15000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
// Checking if anonymous ( not important)
StreamReader sr = new StreamReader(stream);
while (sr.EndOfStream != true)
{
string checking = sr.ReadLine();
if (!checking.Contains("REMOTE_ADDR ="))
p_work.Items.Add(proxy);
}
sr.Close();
stream.Close();
}
catch (Exception ex)
{
ktory = 1;
}
}
< Для кода: ile и ktory такие же, как i, или j как многочисленные переменные >
Но моя многопоточность останавливается на 10 первых прокси или просто проверяет их 10 раз как один…
Основная проблема заключается в том, чтобы заставить 10 ботов проверять прокси и после завершения проверки одного прокси переходить на другой в listbox (но все еще другие боты работают в фоновом режиме)
ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ 🙂 Я сижу над этим 2-й день и не могу разобраться
Комментарии:
1. CheckForIllegalCrossThreadCalls = false; … Вероятно, это не очень хорошая идея. Вы, вероятно, захотите посмотреть, как вы правильно получаете доступ к элементам управления из потока. Делегирование, вызов и т.д.
2. Вы создаете только 10 потоков для вызова этой функции, поэтому они будут выполняться только 10 раз. Кроме того,
ktory = 1;
не является потокобезопасным. Остальную часть кода не просматривал, но именно поэтому вы видите результаты, о которых вы упомянули.3. Надеюсь, вы не используете их для рассылки спама
Ответ №1:
Вы не блокируете доступ к ktory
, который изменяется несколькими потоками. Из-за этого нет гарантии, что ваши 10 потоков проверят 10 разных прокси.
Object _lock = new Object();
int ktory=0;
...
private void test_proxy()
{
try
{
int ile = p_listbox.Items.Count;
string proxy = null;
//'ktory' - means position in listbox
lock (_lock) {
proxy = p_listbox.Items[ktory].ToString();
ktory = 1;
}
...
Комментарии:
1. 1. Кроме того,
Interlocked.Increment
здесь было бы полезно — msdn.microsoft.com/en-us/library/dd78zt0c.aspx