c# Thread Ожидать завершение работы потока
Есть код
for (int i = 0; i < 5; i++)
{
if (SerwiseList["One"] == true)
{
log.Report("Старт");
Thread thread1 = new Thread(Start); // Создаём поток 1
thread1.Start(); // Запуск потока 1
thread1.Join();
thread1.Abort();
}
}
Мне нужно выполнить метод Start() 5 раз, при этом нужно запустить поток, дождаться пока он завершит работу, затем выполнить его повторно.
Метод Join блокирует выполнение вызвавшего его потока до тех пор, пока не завершится поток, для которого был вызван данный метод
У меня он не работает, цикл выполняеться сразу 5 раз подряд
Как можно приостановить основной поток пока поток thread1 не завершит работу?
UPD
Метод Start
async public void Start()
{
for (int j = 0; j < CountUpdates; j++)
{
log.Report(await httpClient.Check(link);
}
}
Start() обращаеться к методу httpClient.Check(link)
public async Task<string> Check(string url)
{
try
{
using (var client = new HttpClient())
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("url", url),
new KeyValuePair<string, string>("app", "site"),
new KeyValuePair<string, string>("version", "0.1"),
});
var result = await client.PostAsync(url, content);
string resultContent = await result.Content.ReadAsStringAsync();
return resultContent;
}
}
catch (Exception e)
{
return null;
}
}
UPD2 Ответ @aepot помог, но появилась навая проблема
for (int i = 0; i < linkList.Length; i++)
{
if (SerwiseList["One"])
{
log.Report("Старт 1");
await Start();
}
if (SerwiseList["Two"])
{
log.Report("Старт 2");
await Start2();
}
if (SerwiseList["Three"])
{
log.Report("Старт 3");
await Start3();
}
}
Метод Start2() начинает работу только после того как закончит выполняться Start(), Start3() работает только после того как завершит работу Start2()
При испольовании Thread Start(), Start2() и Start3() работали паралельно
if (SerwiseList["One"] == true)
{
log.Report("Старт");
Thread thread1 = new Thread(Start); // Создаём поток 1
thread1.Start(); // Запуск потока 1
}
if (SerwiseList["Two"])
{
log.Report("Старт 2");
Thread thread1 = new Thread(Start2); // Создаём поток 1
thread1.Start(); // Запуск потока 1
}
if (SerwiseList["Three"])
{
log.Report("Старт 3");
Thread thread1 = new Thread(Start3); // Создаём поток 1
thread1.Start(); // Запуск потока 1
}
Ответы (1 шт):
Ну вот теперь все понятно, async void.
При этом вы пытаетесь в потоке запустить и без того асинхронный метод. Представьте что вы пнули мячик и отвернулись не дожидаясь как он долетит, вот это async void. А Thread разница в том, что вы просите пнуть этот мячик соседа, он так же ничего не будет дожидаться.
for (int i = 0; i < 5; i++)
{
if (SerwiseList["One"])
{
log.Report("Старт");
await Start();
}
}
public async Task Start()
{
for (int j = 0; j < CountUpdates; j++)
{
log.Report(await httpClient.Check(link));
}
}
UPD
Давайте по одной проблеме на вопрос. Если после полученного ответа у вас появляется новый вопрос, отметьте ответ принятым, и задайте новый вопрос отдельно.
for (int i = 0; i < linkList.Length; i++)
{
List<Task> tasks = new List<Task>()
if (SerwiseList["One"])
{
log.Report("Старт 1");
tasks.Add(Start());
}
if (SerwiseList["Two"])
{
log.Report("Старт 2");
tasks.Add(Start2());
}
if (SerwiseList["Three"])
{
log.Report("Старт 3");
tasks.Add(Start3());
}
await Task.WhenAll(tasks);
}