Tengo una aplicación que tiene dos hilos.¿Completamente cerrada la aplicación de subprocesos múltiples?
El primero (el hilo principal) que captura los datos utilizando socket y actualizar DataTables
Los segundos insertos los DataTables en la base de datos.
La aplicación funciona bien pero cuando se cierra, el hilo principal termina de leer los datos y llama al método Anular en el segundo hilo, que puede estar insertándose en la base de datos y esto lleva a datos inconsistentes.
Actualmente estoy usando la siguiente solución para superar "abortar durante la inserción"
EDIT: Después de las respuestas potentes he cambiado el código
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
}
}
}
Así que ... ¡no llame "Abortar"! No es una buena idea. Nunca. –
Re su comentario "No quiero usar la transacción (por rendimiento), así que sin usar mutex e hilo.abortar la aplicación dará lugar a registros inconsistentes "- Tengo que secundar a Sam, eso es una locura. La mayoría de las bases de datos están totalmente optimizadas para las transacciones (de hecho, a menudo solo una reversión conlleva un costo adicional). No importa qué tan rápido su aplicación se puede ejecutar si se corrompe el estado. Primero hágalo funcionar con firmeza, luego (si es demasiado lento) perfile y encuentre los cuellos de botella de rendimiento real, y soluciónelos. No corrompa la base de datos ... –
En particular, su mutex hace * * nada ** para ayudarlo cuando su ejecutor muera debido a factores externos ("proceso de eliminación", BSOD o (más probable) falla de energía). Solo una transacción está diseñada para proteger su inserción. ¿Por qué no le gustan? ? –