View Single Post
Old 19-04-2017, 08:46   #7
fano
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2095
Quote:
Originariamente inviato da coffe_killer Guarda i messaggi
Sisi intendo quello per Model.
Dai giocaci un po' e fammi sapere
Per ora non ho provato ad usare Entity Framework, ma mi sembra che l'approccio messaggi dovrebbe funzionare in questo modo:

1. Con Ask() chiedo al Actor Storage di eseguire uno Statement (Select, Insert, Update...)
2. Storage analizza il messaggio ed esegue la query corrispondente con LINQ si "crea" dal nulla l'oggetto e lo si spara come risposta
3. Il Processo richiedente "ritorna" da Ask() che è una chiamata sincrona e procede a fare qualcosa con i dati ottenuti

Mi confermi che Entity Framework non è thread safe vero?
Quindi 2 Actor non possono richiedere di fare Insert nemmeno su 2 tabelle separate nello stesso istante?

Mi chiedo se varrebbe la pena di usare NHibernate o qualche cos'altro il fatto di non poter usare i thread col DB è il punto debole dell'applicazione "distribuita" che usiamo ora fatta in C: sqlite non è thread safe e quindi abbiamo una sola applicazione che si occupa di "serializzare" (nel senso che li esegue in serie ) tutti i comandi verso il DB questo ci è quasi sempre andato bene finché abbiamo avuto la necessità di fare INSERT di 100'000 righe tutte in una botta e lì ci siamo potuti scordare con il C solo di provare ad allocare un json con 100'000 elementi e poi trasferirlo allo Storage per fare la INSERT: il resto dell'applicazione era bloccato!
A quel punto - con la coda tra le gambe - abbiamo dovuto fare kludge piuttosto orrendi database "privato" dell'applicazione che poveraccia si deve caricare 100'000 righe e fare 100'000 INSERT e poi quando ha finito comando "ATTACH" allo Storage... uno schifo

Quote:
Originariamente inviato da coffe_killer Guarda i messaggi
Se non hai sempre la GUI allora l'actor che dovrebbe rappresentarla penso si possa interrogare solo a tua scelta. Non hai bisogno della GUI, non lo richiami, altrimenti sì. Penso che si possa fare con questo paradigma in qualche modo, mi stupirei non si potesse fare.
Sì funziona!

Ecco come ho fatto:

Codice:
        [STAThread] //optional
        protected static bool StartUILoop()
        {
            Application.Run();
            return true;
        }

        protected override void PreStart()
        {
            /* Let's start an Empty UI Application, the true Application will load the page with "Loading..." */
            //Task mytask = Task.Run(() => Application.Run());

            Task mytask = Task.Run(() =>
                StartUILoop()
            );
        }
Quando poi ricevo un comando (in questo caso carica la form di Login) faccio semplicemente:

Codice:
           var form = new LoginForm();
           form.ShowDialog();
Ero rimasto "bloccato" (in tutti i sensi) perché il metodo più ovvio form.Show() mi dava una GUI morta manco disegnata tutta, non attiva e pure "rotellante", in futuro a richiesta del resto dei processi dovrò caricare anche:

1. MessageBox
2. Menu
3. Scrivere su uno o più field di una "pagina" caricata
4. Far ritornare tutti i dati di input inseriti dall'utente (sono un po' sorpreso che non esista un metodo di "Form" che lo faccia automaticamente!)

Devo studiare se si riesce a caricare un elemento GUI dato il nome e poi sono a cavallo
__________________
Cosmos C# Open Source Managed Operating System
Cosmos Thread Ufficiale
Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat!

Ultima modifica di fano : 19-04-2017 alle 08:49.
fano è offline   Rispondi citando il messaggio o parte di esso