56 messaggi dal 31 maggio 2004
Salve a tutti,
in un componente Blazor (.razor) .net core 5.0 ho implementato questa funzione che aggiorna il mio database leggendo i dati da un file .txt:

private async Task updateDatabaseAsync()
    {
        try
        {
            [ ... code ... ]
            
            // Update Database (post API)
            //
            int intTotal = 11;
            List<string> lstMyList = File.ReadLines(strPathNameText).Reverse().Take(intTotal).Reverse().ToList();
            //
            string sep = "\t";
            foreach (string txtMyDataInList in lstMyList)
            {
                MyData newData = new MyData();
                //
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[0];
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[1];
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[2];
                //
                await MyService.PostUpdateDatabase(newData);
            }
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            throw;
        }
    }


Il metodo funziona correttamente, in pratica mette in una lista le righe lette dal file .txt, esegue un ciclo foreach per leggere ogni singola riga e richiamare una web api per salvare i dati nel database (MyService.PostUpdateDatabase) che è pure questo un metodo asincrono.

Lo stesso metodo (e sottolineo LO STESSO) l'ho però spostato in una classe generica per poterlo utilizzare in più parti del codice e non funziona più! All'interno del ciclo foreach, quando richiama la web api, ritorna sempre l'errore: "object reference not set to an instance of an object", che non dice niente.

Ho provato varie alternative, ho eliminato il ciclo foreach e sostituendolo con Parallel, oppure ad usare "Task.WhenAll(tasks);", ma niente, sempre lo stesso errore. Ad esempio:

foreach (var txtEstrazione in lstUltimeEstrazioni)
{
    tasks.Add(Task.Run(async () =>
    {
                MyData newData = new MyData();
                //
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[0];
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[1];
                newData.TypeData01 = txtMyDataInList.Split(separator: sep.ToCharArray())[2];
                //
                await MyService.PostUpdateDatabase(newData);
    }));
}
Task.WhenAll(tasks);
tasks = null;


Secondo voi dove può essere il problema? Cosa posso indagare per capirne l'origine?

Grazie in anticipo.
Igor.
497 messaggi dal 08 febbraio 2009
Ciao

Così a prima vista credo che il problema sia legato alla variabile MyService.
Quando la usi all'interno del metodo Razor, probabilmente viene istanziata dal motore di D.I. del runtime in cui gira.

Se la sposti fuori, devi preoccuparti di valorizzarla/istanziarla in qualche modo.

Può essere questo il problema?
56 messaggi dal 31 maggio 2004
Ciao Joe,
non so come ringraziarti, mi hai dato la direzione giusta dove indagare. Io andavo a cercare il problema da tutt'altra parte. E invece era proprio un problema di come iniettavo il servizio nella classe.

Ho ancora molto da imparare su Blazor.

Saluti.
Igor.

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.