He encontrado diferentes artículos sobre esta excepción, pero ninguno de ellos era mi caso. Aquí está el código fuente:Se ha llamado al método de sincronización de objetos desde un bloque de código no sincronizado. Excepción en Mutex.Release()
class Program
{
private static Mutex mutex;
private static bool mutexIsLocked = false;
static void Main(string[] args)
{
ICrmService crmService =
new ArmenianSoftware.Crm.Common.CrmServiceWrapper(GetCrmService("Armsoft", "crmserver"));
//Lock mutex for concurrent access to workflow
mutex = new Mutex(true, "ArmenianSoftware.Crm.Common.FilterCtiCallLogActivity");
mutexIsLocked = true;
//Create object for updating filtered cti call log
ArmenianSoftware.Crm.Common.FilterCtiCallLog filterCtiCallLog =
new ArmenianSoftware.Crm.Common.FilterCtiCallLog(crmService);
//Bind events
filterCtiCallLog.CtiCallsRetrieved += new EventHandler<ArmenianSoftware.Crm.Common.CtiCallsRetrievedEventArgs>(filterCtiCallLog_CtiCallsRetrieved);
//Execute filter
try
{
filterCtiCallLog.CreateFilteredCtiCallLogSync();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (mutexIsLocked)
{
mutexIsLocked = false;
mutex.ReleaseMutex();
}
}
}
static void filterCtiCallLog_CtiCallsRetrieved(object sender,
ArmenianSoftware.Crm.Common.CtiCallsRetrievedEventArgs e)
{
tryasasas
{
if (mutexIsLocked)
{
mutexIsLocked = false;
mutex.ReleaseMutex();
}
}
catch (Exception ex)
{
throw ex;
}
}
}
filterCtiCallLog.CreateFilteredCtiCallLogSync();
función ejecuta las peticiones al servidor, y plantea algunos eventos, uno de los cuales es CtiCallsRetrieve
evento. Y necesito liberar el mutex cuando se active este evento. Pero al llamar se lanza la excepción de función mutex.Release(). CreateFilteredCtiCallLogSync
funciona sincrónicamente. ¿Cuál es el problema?
Tienes razón, me perdí que el hilo que configuraba la devolución de llamada es el hilo principal :( –
AutoResetEvent es genial! Gracias Hans. –