Я работаю над плагином для программы, которая должна делать вызовы API, я ранее делал их все синхронно, что, ну, это работало, было медленно.
Чтобы бороться с этим, я пытаюсь сделатьвызывает асинхронно, я могу сделать 10 в секунду, поэтому я пробовал следующее:
Parallel.ForEach(
items.Values,
new ParallelOptions { MaxDegreeOfParallelism = 10 },
async item => {
await item.UpdateMarketData(client, HQOnly.Checked, retainers);
await Task.Delay(1000);
}
);
клиент является объектом HttpClient, а остальное используется для создания вызова API или для материала, который делается в результатевызов API.Каждый раз, когда item.UpdateMarketData () вызывается 1, и выполняется только 1 вызов API.
Этот код, кажется, завершается очень быстро, и, насколько я понимаю, программа должна дождаться завершения Parallel.ForEach (), прежде чем продолжить.
данные, которые должны быть установлены элементом.UpdateMarketData () также не устанавливается.Чтобы удостовериться, я даже установил MaxDegreeOfParallelism = 1 и задержку на 3 секунды, и он все еще завершился очень быстро, несмотря на то, что осталось ~ 44 элемента.Буду признателен за любую помощь.
UpdateMarketData () включен ниже на случай, если это уместно
public async Task UpdateMarketData(TextBox DebugTextBox,HttpClient client, bool HQOnly, List<string> retainers)
{
HttpResponseMessage sellers_result = null;
try
{
sellers_result = await client.GetAsync(String.Format("www.apiImCalling/items/{0}?key=secretapikey", ID));
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(String.Format("{0} Exception caught.", e));
sellers_result = null;
}
var results = JsonConvert.DeserializeObject<RootObjectMB>(sellers_result.Content.ReadAsStringAsync().Result);
int count = 0;
OnMB = false;
LowestOnMB = false;
LowestPrice = int.MaxValue;
try
{
foreach (var x in results.Prices)
{
if (x.IsHQ | !(HQOnly && RequireHQ))
{
count++;
if (count == 1)
{
LowestPrice = x.PricePerUnit;
}
if (retainers.Contains(x.RetainerName))
{
Retainer = x.RetainerName;
OnMB = true;
Price = x.PricePerUnit;
if (count == 1)
{
LowestOnMB = true;
}
}
if (LowestPrice == x.PricePerUnit && x.RetainerName != Retainer)
{
LowestOnMB = false;
}
}
}
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(String.Format("{0} Exception caught.", e));
}
}