Ho un'applicazione con due thread.Chiude con grazia un'applicazione multithreading?
Il primo (il filo principale) che acquisisce i dati utilizzando presa e aggiornare DataTables
I secondi inserti i DataTables nel database.
L'applicazione funziona correttamente ma, una volta chiusa, il thread principale termina la lettura dei dati e chiama il metodo Abort nel secondo thread, che potrebbe essere inserito nel database e ciò porta a dati incoerenti.
Attualmente sto usando la seguente soluzione per superare "interruzione durante l'inserimento"
EDIT: Dopo le risposte potenti ho cambiato il codice
void MainThread()
{
while(Read())
{
//Read Data through socket
try
{
//Wait on Mutex1
//Update Tables
}
finally
{
//Release Mutex1
}
}
_isrunning = false;
_secondThread.Join();
}
void SecondThread()
{
while(_isrunning)
{
try
{
//Wait on Mutex1
//Insert Tables into Database using transactions
}
finally
{
//Release Mutex1
}
}
}
Quindi .. non chiamare "Abort"! Non è una buona idea. Mai. –
Re il tuo commento "Non voglio usare la transazione (per le prestazioni), quindi senza usare mutex e thread.l'applicazione interromperà a record incoerenti "- Devo passare a Sam, che è semplicemente folle.La maggior parte dei database sono completamente ottimizzati per le transazioni (infatti, spesso solo un rollback comporta costi aggiuntivi). Non importa quanto sia veloce la tua app può funzionare se corrompe lo stato, farlo funzionare prima in modo robusto, quindi (se è troppo lento) profilarlo e trovare i colli di bottiglia delle prestazioni effettivi e correggerli. Non danneggiare il database ... –
In particolare, il tuo mutex funziona * * niente ** per aiutare quando il tuo exe muore a causa di fattori esterni ("processo di uccisione", BSOD, o (più probabilmente) un'interruzione dell'alimentazione) .Perché una tua operazione è progettata per rendere sicuro il tuo inserto, perché non ti piacciono ? Inserimento –