Попробуйте использовать
HttpClient:
private async Task<string> Get(string url)
{
using (var client = new HttpClient())
{
using (var r = await client.GetAsync(new Uri(url)))
{
return await r.Content.ReadAsStringAsync();
}
}
}
Но придется вызов метода
Get делать с
await, и далее по цепочке вверх, добавлять
async/await:
string result = await Get("https://toster.ru/q/470456");
В качестве альтернативного варианта, можно запускать запросы асинхронно и передавать результат выполнения запроса в функцию. С вашим кодом, примерно так:
private void Get(string url)
{
Task.Run(async () =>
{
WebRequest req = WebRequest.Create(url);
WebResponse resp = await req.GetResponseAsync();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string result = await sr.ReadToEndAsync();
sr.Close();
// передаем результат
ResultCallback(url, result);
});
}
private void ResultCallback(string url, string result)
{
// выводим в консоль результат
Console.WriteLine(url);
Console.WriteLine(result);
}
Аналогичный вариант с HttpClientprivate void Get(string url)
{
Task.Run(async () =>
{
using (var client = new HttpClient())
{
using (var r = await client.GetAsync(new Uri(url)))
{
string result = await r.Content.ReadAsStringAsync();
ResultCallback(url, result);
}
}
});
}
Обертка кода, указанного в тексте вопроса, с минимальными изменениямиprivate void Get(string url)
{
// выполняем запрос в отдельном потоке
Task.Run(() =>
{
WebRequest req = WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string result = sr.ReadToEnd();
sr.Close();
// передаем результат в функцию обратного вызова
ResultCallback(url, result);
});
}
private void ResultCallback(string url, string result)
{
Console.WriteLine(url);
Console.WriteLine(result);
}
Вариант с оберткой Thread, если используются старая версия .NETprivate void Get(string url)
{
// создаем поток
var t = new Thread(() =>
{
WebRequest req = WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string result = sr.ReadToEnd();
sr.Close();
ResultCallback(url, result);
});
// запускаем
t.Start();
}
private void ResultCallback(string url, string result)
{
Console.WriteLine(url);
Console.WriteLine(result);
}