У меня есть веб-сайт ASP.NET Core MVC с картой d3.js.Мне нужно запустить серию асинхронных методов в фоновом режиме, чтобы захватить некоторые данные, обработать их и отправить их на карту.
Я создал класс с этими методами и одну «точку входа», котораяконтролирует запуск остальных задач.Эта «точка входа» вызывается из HomeController.cs перед загрузкой представления.Но мне действительно все равно, загружается ли представление после или до того, как параллельные задачи начинают делать свое дело
Код HomeController:
//public IActionResult PulseNest()
public async Task<ActionResult> PulseNest()
{
ViewData["Title"] = "PulseNest";
Listener nl = new Listener();
nl.startListening();
return View();
}
Код прослушивателя:
public async void startListening()
{
listen([...]);
drawing();
}
[...]
private async Task drawing()
{
do
{
if (pool.Count > 0)
{
//This is the call for the SignalR sending data to the front
await uH.SendNewPoint(pool[rdm.Next(0, pool.Count - 1)]);
}
} while (true);
}
[...]
private async Task listen([...])
{
//[Retrieving Data]
processData([...]);
}
[...]
private void processData([...])
{
//[Processing the data and adding it to the pool]
}
Что я намеревался сделать: когда я получаю доступ к этой странице, я запускаю серию потоков, которые извлекают и обрабатывают данные (на данный момент, если я смогу заставить его работать только один, я был бы действительно счастлив)и еще один, который отправляет эти данные во внешний интерфейс с помощью SignalR, а затем представляет эти данные на карте.
Катастрофический результат: когда я открываю эту страницу, HomeController вызывает startListening.Затем запускаются вызовы startListening для прослушивания и отрисовки, а выполнение продолжается в этом цикле ... Потоки вообще не работают ... И никогда не возвращаются в HomeCotroller, и поэтому View () никогда не вызывается ...
Я даже попытался определить startListening () как Task и вызвать его из HomeController следующим образом:
Listener nl = new Listener();
Task listening = nl.startListening();
listening.Start();
return View();
Но затем код выдает исключение: InvalidOperationException: Start не может быть вызван для задачи, которая завершилась.
Я также пытался сделать это в классе Listen:
public async Task startListening()
{
Task listening = listen([...]);
listening.Start();
Task draw = drawing();
draw.Start();
}
В этом случае, когда я отлаживаю программу, представление загружается, но я могу видеть в СобытияхСредства диагностики, которые некоторые потоки выдают исключение: "System.InvalidOperationException in System.Provate.CoreLib.dll("Start may not be called on a promise-style task.").
Если я дважды щелкну по нему, он ссылается на listen.Start ();line ...
Я довольно новичок в Core и уверен, что это ошибка в моем понимании Task.Но я искал в MSDN и не могу найти простое объяснение этого для Core MVC.
Любая помощь или ссылка на статью MSDN, была бы очень признательна.