Como passar parâmetros para o Thread.ThreadStart()
método em c #?
Suponha que eu tenha um método chamado 'download'
public void download(string filename)
{
// download code
}
Agora eu criei um thread no método principal:
Thread thread = new Thread(new ThreadStart(download(filename));
tipo de método de erro esperado.
Como posso passar parâmetros para ThreadStart
com o método target com parâmetros?
c#
.net
multithreading
Swapnil Gupta
fonte
fonte
Respostas:
O mais simples é apenas
A (s) vantagem (s) disso (acima
ParameterizedThreadStart
) é que você pode passar vários parâmetros e obter a verificação do tempo de compilação sem precisar converterobject
o tempo todo.fonte
new Thread(delegate() { download(filename); });
Veja este exemplo:
Primeiro, você cria um encadeamento passando o método delegate to worker e o inicia com um método Thread.Start que leva seu objeto como parâmetro.
Portanto, no seu caso, você deve usá-lo assim:
Mas o seu método 'download' ainda precisa pegar um objeto , não uma string como parâmetro. Você pode convertê-lo em string no corpo do método.
fonte
Você deseja usar o
ParameterizedThreadStart
delegado para métodos de encadeamento que usam parâmetros. (Ou nenhum, na verdade, e deixe oThread
construtor inferir.)Exemplo de uso:
fonte
Você também pode
delegate
gostar ...fonte
Em Adicional
fonte
Você pode encapsular a função de encadeamento (download) e os parâmetros necessários (nome do arquivo) em uma classe e usar o delegado ThreadStart para executar a função de encadeamento.
fonte
Eu recomendo que você tenha outra classe chamada Arquivo.
E no seu código de criação de threads, você instancia um novo arquivo:
fonte
Que tal isso: (ou está ok para usar assim?)
fonte
De acordo com sua pergunta ...
... e o erro encontrado, você precisaria corrigir seu código de
para
No entanto, a questão é mais complexa, como parece à primeira vista.
A
Thread
classe atualmente (4.7.2) fornece vários construtores e umStart
método com sobrecargas.Esses construtores relevantes para esta pergunta são:
e
que leva um
ThreadStart
delegado ou umParameterizedThreadStart
delegado.Os delegados correspondentes ficam assim:
Portanto, como pode ser visto, o construtor correto a ser usado parece ser aquele que recebe um
ParameterizedThreadStart
delegado, para que algum método em conformidade com a assinatura especificada do delegado possa ser iniciado pelo encadeamento.Um exemplo simples para instanciar a
Thread
classe seriaou apenas
A assinatura do método correspondente (chamada
Work
neste exemplo) se parece com isso:O que resta é iniciar o thread. Isso é feito usando qualquer um
ou
Enquanto
Start()
iniciaria o encadeamento e passarianull
como dados para o método,Start(...)
pode ser usado para passar qualquer coisa para oWork
método do encadeamento.No entanto, há um grande problema com essa abordagem: tudo o
Work
que é passado no método é convertido em um objeto. Isso significa que, dentro doWork
método, ele deve ser convertido para o tipo original novamente, como no exemplo a seguir:A transmissão é algo que você normalmente não deseja fazer.
E se alguém passa outra coisa que não é uma string? Como isso parece inicialmente impossível (porque é o meu método, eu sei o que faço ou O método é privado, como alguém deve ser capaz de transmitir alguma coisa a ele? ), Você pode acabar exatamente com esse caso por vários motivos . Como alguns casos podem não ser um problema, outros são. Nesses casos, você provavelmente terminará com um
InvalidCastException
que provavelmente não notará porque simplesmente encerra o encadeamento.Como solução, você esperaria obter um
ParameterizedThreadStart
representante genérico comoParameterizedThreadStart<T>
ondeT
seria o tipo de dados que você deseja passar para oWork
método. Infelizmente, algo assim não existe (ainda?).Existe, no entanto, uma solução sugerida para esse problema. Envolve a criação de uma classe que contém os dados a serem passados para o encadeamento, bem como o método que representa o método worker como este:
Com essa abordagem, você iniciaria o thread assim:
Dessa forma, você simplesmente evita a transmissão e tem uma maneira tipicamente segura de fornecer dados para um thread ;-)
fonte
aqui é o caminho perfeito ...
fonte