Pergunta

isso é uma continuação de outro pergunta meu.

Basicamente, assim que eu tiver o código para acessar o arquivo (revisarei as respostas em um minuto), qual seria a melhor maneira de teste isto?

Estou pensando em criar um método que gere muitos Trabalhador de fundo's ou algo assim e diz a todos para carregar/salvar o arquivo e testar com tamanhos variados de arquivo/objeto.Em seguida, obtenha uma resposta dos threads para ver se falhou/foi bem-sucedido/fez o mundo implodir, etc.

Vocês podem oferecer alguma sugestão sobre a melhor maneira de abordar isso?Como eu disse antes, tudo isso é meio novo para mim :)

Editar

Seguindo de Ajmastrean publicar:

Estou usando um aplicativo de console para testar com Debug.Asserts :)


Atualizar

Eu originalmente rolei com o uso Trabalhador de fundo para lidar com o threading (já que estou acostumado com isso no Windows dev), logo percebi que quando estava realizando testes onde várias operações (threads) precisavam ser concluídas antes de continuar, percebi que seria um pouco complicado para faça isso.

Eu então segui Ajmastreanpost e percebi que eu realmente deveria usar o Fio classe para trabalhar com operações simultâneas.Agora irei refatorar usando este método (embora com uma abordagem diferente).

Foi útil?

Solução

Na rede, ThreadPool tópicos não retornarão sem configuração ManualResetEventou AutoResetEventS.Acho isso um exagero para um método de teste rápido (sem mencionar que é meio complicado de criar, configurar e gerenciar).O trabalhador em segundo plano também é um pouco complexo com retornos de chamada e coisas assim.

Algo que descobri que funciona é

  1. Crie uma série de threads.
  2. Configure o ThreadStart método de cada thread.
  3. Inicie cada tópico.
  4. Join em todos os threads (bloqueia o thread atual até que todos os outros threads sejam concluídos ou abortados)
public static void MultiThreadedTest()
{
    Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    foreach(Thread thread in threads)
    {
        thread.Join();
    }
}

Outras dicas

@ajmastrean, como o resultado do teste de unidade deve ser previsível, precisamos sincronizar os threads de alguma forma.Não consigo ver uma maneira simples de fazer isso sem usar eventos.

Descobri que ThreadPool.QueueUserWorkItem me oferece uma maneira fácil de testar esses casos de uso

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

Sua ideia deve funcionar bem.Basicamente, você só deseja gerar um monte de threads e garantir que aqueles que estão escrevendo o arquivo demorem o suficiente para fazer os leitores esperarem.Se todos os seus threads retornarem sem erros e sem bloqueios para sempre, o teste será bem-sucedido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top