944 messaggi dal 11 febbraio 2013
In un app netcore sto cercando di eseguire dei task in parallelo e di aggiornare la UI
ma la ui non si aggiorna e i task non partono

[HttpPost]
        public IActionResult StartProgress()
        {
            string jobId = Guid.NewGuid().ToString("N");
            _queue.QueueAsyncTask(() => Sync(jobId));

            return RedirectToAction("Progress", new { jobId });
        }

        public IActionResult Progress(string jobId)
        {
            ViewBag.JobId = jobId;
            return View();
        }

        public async Task Sync(string jobId)
        {
            var tablesToSync = new List<Task>();

            tablesToSync.Add(FillAgenti());
            tablesToSync.Add(...

            int processed = 0;
            await Task.WhenAll(tablesToSync.Select(async table =>
            {
                await table;//not run?
                await _hubContext.Clients.Group(jobId)
                     .SendAsync("progress", processed++ / tablesToSync.Count());
            }));
   
        }

        private async Task<Task> FillAgenti()
        {
            var agents = await new Agent(_companyContext).GetAgentsAsync();
            var agenteRepository = new AgenteRepository(_applicationContext);
            await agenteRepository.RemoveAllAgentiAsync();
            var fillAgenti = agenteRepository.AddAgentiAsync(
                await agenteRepository.FillAgentiFomCompanyAsync(agents));

            return fillAgenti;
   ecc...

public class JobProgressHub: Hub
    {
        //call from client
        public async Task AssociateJob(string jobId)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, jobId);
            
        }
    }
        }


cosa sbaglio?
grazie
Modificato da jjchuck il 16 dicembre 2018 16.38 -
244 messaggi dal 22 gennaio 2017
Contributi
_queue.QueueAsyncTask(() => Sync(jobId));

Lanci la funzione e successivamente fai una redirect. Appena esci dal metodo principale, il task aperto potrebbe essere terminato.
Quale sarebbe lo scopo della redirect al metodo progress?
Non puoi spostare le due righe di quella funzione nel StartProgress?

Seconda cosa, il metodo Sync lo chiami in maniera sincrona.
_queue.QueueAsyncTask(async () => await Sync(jobId));
944 messaggi dal 11 febbraio 2013
sto seguendo questo esempio per adattarlo con le poche cose che so al mio caso
https://www.jerriepelser.com/blog/communicate-status-background-job-signalr/

vorrei copiare una serie di tabelle e mostrare all'utente una progress bar per ogni tabella

ma non so come fare cosi sono partito da quell'esempio

ma con poco successo
244 messaggi dal 22 gennaio 2017
Contributi
Hai provato a far funzionare questo: https://github.com/jerriepelser-blog/signalr-long-running
944 messaggi dal 11 febbraio 2013
Si Andrea il codice della demo funziona
Solo quando cerco di adattarlo alla mia situazione non va

Ma è perché non conosco bene come muovermi

Ricordo di una demo in netstandard di Moreno con hangfire e signalr...

Spero di ritrovarla e riadattarla

Ciao

ps se hai altri suggerimenti ovviamente sono apprezzati
Modificato da jjchuck il 17 dicembre 2018 10.11 -
244 messaggi dal 22 gennaio 2017
Contributi
Posta l'intero metodo Sync, l'errore sta li.
944 messaggi dal 11 febbraio 2013
Per ora è quello solo ci sono alcune tabelle che li ho omesso ma sono metodi identici

public async Task Sync(string jobId)
        {
            var tablesToSync = new List<Task>();

            var fillAgenti = FillAgenti();
            var fillClienti = FillClienti();
            var fillClientiAgenti = FillClientiAgenti();
            var fillArticoli = FillArticoli();

            tablesToSync.Add(fillAgenti);
            tablesToSync.Add(fillClienti);
            tablesToSync.Add(fillClientiAgenti);
            tablesToSync.Add(fillArticoli);

            int processed = 0;
            await Task.WhenAll(tablesToSync.Select(async table =>
            {
                await table;//not run?
                await _hubContext.Clients.Group(jobId)
                     .SendAsync("progress", processed++ / tablesToSync.Count());
            }));


        }
244 messaggi dal 22 gennaio 2017
Contributi
Prova a inserire la chiamata all'hub dentro al metodo FillXXX

 await Task.WhenAll(tablesToSync.Select(async table =>
            {
                await table;//not run?
                await _hubContext.Clients.Group(jobId)
                     .SendAsync("progress", processed++ / tablesToSync.Count());
            }));

Ottenendo così:
 await Task.WhenAll(tablesToSync);

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.