В программу загружаются ссылки из txt и добавляются в очередь. Далее нужно брать ссылку - переходить по ней и парсить значение online И последнее это склеить ссылку и ответ парсера. p/s : учу c# чуть больше недели, сильно не пиннайте )
Многопоточность я реализовал так:
for (int i = 1; i < load.Count; i++)
{
Thread myThread = new Thread(Proccess);
myThread.IsBackground = true;
myThread.Start();
код метода Process
public void Proccess()
{
string url;
while (load.Count > 0)
{
lock (locks)
{
var que = load.Dequeline();
url = que;
}
try
{
hsettings.Reque(url);
Invoke((() =>
{
textBox1.AppendText(url + " | " + hsettings.online + '\r' + '\n');
}));
}
В результате я получаю
https://Myurl1 | 1000 online https://Myurl2 | 1200 online https://Myurl3 | 1000 online
Хотя в Myurl 3 online = 1500, но почему то был взят результат из Myurl1 И каждый запуск выводит разные данные. Я так понимаю, что из за неправильно реализации многопоточности.
Для более точной информации:
Метод Reque:
public void Reque(string line) \\ line берём из очереди
{
using (HttpRequest httpRequest = new()
{
UserAgent = Http.RandomUserAgent(),
AllowAutoRedirect = false,
IgnoreProtocolErrors = true,
UseCookies = false,
EnableEncodingContent = false,
})
try
{
var status = httpRequest.Get($"{line}");
Мне нужно что-бы 10, 100 , 1000 url - без разницы сколько их будет, был получен ответ и из ответа надо достать информацию о кол-ве онлайн пользователей и склеить ссылку с этим кол-вом. Но у меня получается каша. lock пробовал, тоже самое.
Вопрос собственно вот в чём, как из потока сохранить полученную информацию ?
В List ?
hsettingsодин на все потоки получается, и все потоки меняют его состояние? Ну вот и получается, что вы печатаете из него значение в одном потоке, а в это время другой поток уже поменял его значение. Лучше использовать в разных потоках разные, не пересекающиеся объекты. А где используете одинаковые, там либо объекты должны быть специально для такого использования предназначены, либо надо делатьlock, но слишком большой кусок кода подlockсведёт на нет всю пользу от многопоточности. – CrazyElf Sep 01 '22 at 06:18Invoke? Winforms? Process - стандартный класс в .NET, вы бы переименовали, чтобы не путать людей. Что такоеhsettings? Что такоеload? По этому обрубку кода ничего не понятно. Покажите все недостающие части. – aepot Sep 01 '22 at 06:47