У меня есть какой -то код, который отлично работает в приложении консоли, но не в приложении Winforms. Кто -нибудь может сказать мне, почему и как исправить, пожалуйста? Targetting .net 8 < /p>
Консольное приложение:
Основной код: < /p>
using System.Collections.Concurrent;
// initialize test data
ConcurrentBag _websites = [ new WebsiteModel("BBC", "https://www.bbc.co.uk"),
new WebsiteModel("Google", "https://www.google.com"),
new WebsiteModel("Amazon","https://www.amazon.com")];
// set mode
bool USE_DOWNLOAD_ASYNC = true;
string mode = USE_DOWNLOAD_ASYNC ? "Asynchronously" : "Synchronously";
Console.WriteLine($"Starting (Running Download {mode})...{Environment.NewLine}");
ParallelLoopResult _loopRes = new();
Task _asyncTaskResult = new(() => { });
if (USE_DOWNLOAD_ASYNC) // Async
{
await Task.Run(async () =>
{
_asyncTaskResult = Parallel.ForEachAsync(_websites, async (site, token) => // (_websites, async (item) =>
{
var res = await DownloadAsync(site);
site.Content = res;
});
await _asyncTaskResult;
});
}
else
{
await Task.Run(() =>
{
_loopRes = Parallel.ForEach(_websites, (item) =>
{
string s = "";
s = Download(item.URL);
item.Content = s;
});
});
}
if ((USE_DOWNLOAD_ASYNC == false && _loopRes.IsCompleted) ||
(USE_DOWNLOAD_ASYNC == true && _asyncTaskResult.IsCompleted))
{
foreach (var item in _websites)
{
Console.WriteLine($"{item.Name}: {item.Content.Length}{Environment.NewLine}");
}
Console.WriteLine("Done.");
}
Console.ReadKey();
// ----------------------------------------------------
static string Download(string site)
{
HttpClient httpClient = new();
var r = httpClient.GetStringAsync(site).Result;
return r;
}
async static Task DownloadAsync(WebsiteModel item)
{
HttpClient httpClient = new();
string res;
res = "" + await httpClient.GetStringAsync(item.URL);
return res;
}
< /code>
websitemodel.cs:
public class WebsiteModel
{
public string Name { get; set; } = "";
public string URL { get; set; } = "";
public string Content { get; set; } = "";
public WebsiteModel()
{
}
public WebsiteModel(string name, string url)
{
Name = name;
URL = url;
}
}
< /code>
winforms app:
код формы: < /p>
private ConcurrentBag _suppliedWebsiteURLs = new();
private ParallelLoopResult _parallelLoopResult = new();
private ConcurrentBag _webModelsBag = new();
private const string ZERO_PERCENT = "0%";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
// start dl
private async void button7_Click(object sender, EventArgs e)
{
button7.Enabled = false;
Progress
progress = new Progress();
progress.ProgressChanged += ReportProgress;
_suppliedWebsiteURLs = SimMethods.PrepWebsitesGroup1Data();
_webModelsBag = SimMethods.PrepWebModelsBag(_suppliedWebsiteURLs);
_parallelLoopResult = new();
var watch = System.Diagnostics.Stopwatch.StartNew();
var results = await SimMethods.RunDownloadParallelAsync(progress,
_webModelsBag,
_suppliedWebsiteURLs);
DisplayResults(results);
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
textBoxDL1.Text += $"Total execution time: {elapsedMs}";
ScrollToCaret();
button7.Enabled = true;
}
private void ScrollToCaret()
{
textBoxDL1.ScrollToCaret();
}
private void DisplayResults(ConcurrentBag results)
{
textBoxDL1.Text = "";
foreach (var item in results)
{
textBoxDL1.AppendText($"{item.WebsiteUrl} " +
$"Downloaded: {item.WebsiteData.Length} " +
$"characters long.{Environment.NewLine}");
}
}
< /code>
simmethods.cs:
public static class SimMethods
{
public static ConcurrentBag PrepWebsitesGroup1Data()
{
ConcurrentBag output = new();
output.Add("https://www.bbc.co.uk");
output.Add("https://www.google.com");
output.Add("https://www.microsoft.com");
output.Add("https://www.youtube.com");
output.Add("https://www.amazon.co.uk");
output.Add("https://www.ebay.co.uk");
output.Add("https://www.rightmove.co.uk");
output.Add("https://en.wikipedia.org/wiki/Main_Page");
output.Add("https://www.duckduckgo.com");
output.Add("https://www.reddit.com");
return output;
}
public static ConcurrentDictionary PrepWebModelsDictionary(ConcurrentBag websites)
{
List items = new List();
foreach (var item in websites)
{
items.Add(new KeyValuePair(item, new WebsiteModel()));
}
var d = new ConcurrentDictionary(items);
return d;
}
public static ConcurrentBag PrepWebModelsBag(ConcurrentBag websites)
{
var d = new ConcurrentBag();
foreach (var item in websites)
{
d.Add(new WebsiteModel(item, item));
}
return d;
}
public static async Task RunDownloadParallelAsync
(IProgress
progress,
ConcurrentBag websites,
ConcurrentBag websitesStrings)
{
Task _asyncTaskResult = new(() => { });
ConcurrentBag _output = new();
await Task.Run(async () =>
{
_asyncTaskResult = Parallel.ForEachAsync(websites, async (site, token) =>
{
var t = await DownloadAsync(site);
site.WebsiteData = t;
});
await _asyncTaskResult;
});
return websites;
}
public async static Task DownloadAsync(WebsiteModel item)
{
HttpClient httpClient = new();
string res;
res = ""+ await httpClient.GetStringAsync(item.WebsiteUrl);
return res;
}
}
< /code>
websitemodel.cs:
public class WebsiteModel
{
public string Name { get; set; } = "";
public string WebsiteUrl { get; set; } = "";
public string WebsiteData { get; set; } = "";
public WebsiteModel()
{
}
public WebsiteModel(string name)
{
Name = name;
}
public WebsiteModel(string name, string url)
{
Name = name;
WebsiteUrl = url;
}
public WebsiteModel(string url, bool useUrlAsName = true)
{
if (useUrlAsName)
Name = url;
WebsiteUrl = url;
}
public WebsiteModel(string data, string url = "", string name = "")
{
WebsiteData = data;
WebsiteUrl = url;
if (name.Trim().Length > 0)
Name = name;
else if (Name.Trim().Length
Исключение происходит на httpclient.getstringasync () call. < /p>
Исключение: < /p>
system.net.http.httprequestexception: 'код состояния ответа не указывает на успех: 403 (заблокирован).' < /p>
< /blockquote>
P> Чтобы уточнить, он работает в приложении Console (не подняты исключения, возвращаются правильные данные), но не в Winforms. В Winforms приведенное выше исключение всегда происходит. Помогите оценить.
Подробнее здесь: https://stackoverflow.com/questions/794 ... tringasync
Проблема с использованием `httpclient.getStringAsync` ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение