Я прочитал эту статью и пытался сделать то же самое https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
Я перебираю набор сущностей в ODATA и пытаюсь обработать их все одновременно ( функция Load ()). Мое консольное приложение выглядит следующим образом
public static async Task Main(string[] args)
{
//List<string> dataareaidlist = new List<string> { "cvl", "cpm", "hk", "ivp",
// "jp", "kr", "me", "na", "sh", "sp", "spb", "spec", "spfr", "spit", "spiv",
// "spuk", "tw", "vgh", "wec", "wge" };
List<string> dataareaidlist = new List<string> { "CAIN", "CPM", "dat", "CGV",
"HK", "JP", "MAL", "ME", "NA", "CVL", "SIN", "SPFR", "SP", "SPIV", "SPIT",
"SPUK", "SPB", "THA", "WEC", "WGE", "TWH", "TW", "KR", "SPEC", "IVP", "MSHK",
"MSSH", "VGH", "SH" };
System.Console.WriteLine("Start program");
List<Load> Entities = new List<Load>();
DateTime startprogram = DateTime.Now;
Entities.Add(new Load("SalesInvoiceLines", dataareaidlist));
Entities.Add(new Load("SalesOrderLines", dataareaidlist));
List<Task<String>> listTaskLoad = new List<Task<String>>();
foreach (Load load in Entities)
{
Entity entity = new Entity(resourceUrl, load.Entity, connection,
accessToken, load.dataareaidlist);
Task<String> t = entity.Load();
listTaskLoad.Add(t);
}
while (listTaskLoad.Any())
{
Task<String> finished = await Task.WhenAny(listTaskLoad);
System.Console.WriteLine("Entity finished:" + finished.Result.ToString());
listTaskLoad.Remove(finished);
finished = null;
}
}
Функция загрузки asyn c
public async Task<String> Load()
{
System.Console.WriteLine("Start Load for entity:" + EntityName);
// GetNumberEntities();
AnalyzeOdataLoad();
TruncateStg();
if (this.dataareaidlist != null)
{
Parallel.ForEach(this.dataareaidlist, (datareaid) =>
{
String url = resourceUrl + "/data/" + EntityName +
"?$filter=dataAreaId eq '" + datareaid + "'&cross-company=true";
Extract(url, 0, 0, 0);
});
}
else
{
String url = resourceUrl + "/data/" + EntityName + "?cross-company=true";
Extract(url, 0, 0, 0);
}
while (listTaskWrite.Any())
{
Task<Guid> finished = await Task.WhenAny(listTaskWrite);
System.Console.WriteLine(" Task finished:" + finished.Result.ToString());
listTaskWrite.Remove(finished);
finished = null;
}
return this.EntityName;
}
Итак, в основной программе l oop для запуска функции Load () начните один за другим (и дождитесь, пока вся функция Load () завершится sh, прежде чем запускать следующую), вместо того, чтобы запускать всю Load () сразу. Не уверен, почему это не начинается все сразу. Я использую тот же логин внутри функции извлечения, чтобы загрузить db asyn c, и он прекрасно работает.
Буду признателен за любую подсказку или ссылку на учебник, который поможет мне понять.
Cheers
Винсент