Quote:
Originariamente inviato da coffe_killer
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
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