é a primeira vez que estou a trabalhar com semáforos em C#, e também para ser sincero nunca semáforos nunca foi o meu forte.
A questão é a seguinte, tenho uma classe estática que vai guardando informação durante o decorrer da aplicação. A essa classe poderão aceder várias threads, e claro existem zonas criticas. Basicamente estou a fazer um sem.WaitOne() quando vou ler/escrever nas zonas criticas e depois faço o sem.Release(). O problema é que a uma determinada altura fica tudo bloqueado, parece uma situação de Deadlock, fica tudo à espera que haja um release.
Aqui fica a classe, se pudessem dar uma vista de olhos e comentar o que está mal agradecia, pois como já referi há pouco não tenho muita experiência com semáforos.
Desde já agradeço a vossa atenção.
class DadosActuais
{
static Semaphore sem = new Semaphore(1, 1);
static ArrayList numeroSerieDesconhecidos = new ArrayList();
static ArrayList numeroSerieConhecidos = new ArrayList();
/// <summary>
/// Adiciona um novo nº de série à lista de nº de série conhecidos
/// </summary>
/// <param name="numeroSerie">Nº de série a adicionar</param>
public static void addNumeroSerieConhecido(string numeroSerie)
{
sem.WaitOne();
numeroSerieConhecidos.Add(numeroSerie);
sem.Release();
}
/// <summary>
/// Adiciona um novo nº de série à lista de nº de série desconhecidos
/// </summary>
/// <param name="numeroSerie"></param>
public static void addNumeroSerieDesconhecido(string numeroSerie)
{
sem.WaitOne();
foreach (string nSerie in numeroSerieDesconhecidos)
{
if (nSerie.CompareTo(numeroSerie) == 0)
return;
}
numeroSerieDesconhecidos.Add(numeroSerie);
sem.Release();
}
/// <summary>
/// Limpa a lista de nº de série desconhecidos
/// </summary>
public static void limpaNumeroSerieDesconhecido()
{
sem.WaitOne();
numeroSerieDesconhecidos.Clear();
sem.Release();
}
/// <summary>
/// Obtém o indice da posição em que se encontra guardado o nº de série do equipamento
/// </summary>
/// <param name="numeroSerie">Nº de série do equipamento</param>
/// <returns>Devolve o indice em que se encontra guardade o equipamento</returns>
private static int getIndiceEquipamento(string numeroSerie)
{
int i = 0;
foreach (string nSerie in numeroSerieConhecidos)
{
if (nSerie.CompareTo(numeroSerie) == 0)
return i;
i++;
}
return i;
}
/// <summary>
/// Guarda os nº de série registados na base de dados
/// </summary>
/// <param name="lista">Lista com equipamentos registados na base de dados</param>
public static void carregaDados(ArrayList listaEq)
{
foreach (Equipamento eq in listaEq)
{
addNumeroSerieConhecido(eq.numeroSerie);
}
}
/// <summary>
/// Verifica se o nº de série é de um equipamento conhecido
/// </summary>
/// <param name="numeroSerie">Nº de série</param>
/// <returns>Devolve true caso o nº de série pertença a um equipamento conhecido ou false caso contrário</returns>
public static bool verificaExisteConhecido(string numeroSerie)
{
sem.WaitOne();
foreach (string nSerie in numeroSerieConhecidos)
{
if (nSerie.CompareTo(numeroSerie) == 0)
{
sem.Release();
return true;
}
}
sem.Release();
return false;
}
/// <summary>
/// Verifica se o nº de série é de um equipamento desconhecido
/// </summary>
/// <param name="numeroSerie">Nº de série</param>
/// <returns>Devolve true caso o nº de série pertença a um equipamento desconhecido ou false caso contrário</returns>
public static bool verificaExisteDesconhecido(string numeroSerie)
{
sem.WaitOne();
foreach (string nSerie in numeroSerieDesconhecidos)
{
if (nSerie.CompareTo(numeroSerie) == 0)
{
sem.Release();
return true;
}
}
sem.Release();
return false;
}
}
Pergunta
cpereira
Olá a todos,
é a primeira vez que estou a trabalhar com semáforos em C#, e também para ser sincero nunca semáforos nunca foi o meu forte.
A questão é a seguinte, tenho uma classe estática que vai guardando informação durante o decorrer da aplicação. A essa classe poderão aceder várias threads, e claro existem zonas criticas. Basicamente estou a fazer um sem.WaitOne() quando vou ler/escrever nas zonas criticas e depois faço o sem.Release(). O problema é que a uma determinada altura fica tudo bloqueado, parece uma situação de Deadlock, fica tudo à espera que haja um release.
Aqui fica a classe, se pudessem dar uma vista de olhos e comentar o que está mal agradecia, pois como já referi há pouco não tenho muita experiência com semáforos.
Desde já agradeço a vossa atenção.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.