/ / Parâmetros do pool de threads - c #, multithreading, threadpool

Parâmetros do pool de threads - c #, multithreading, threadpool

Eu tenho procurado em todos os lugares e preciso de umsolução que me permitisse adicionar de 200 a 300 trabalhos com uma determinada função que aceita parâmetros. Eu sei sobre delegado e objeto como parâmetro único, mas esperava algo que permitisse enfileirar as tarefas, cada uma com paramentares diferentes, em vez de apenas parametros de objeto.

Qualquer ajuda seria muito apreciada.

Respostas:

2 para resposta № 1

Você pode fazer algo assim:

void MyMethod(int param)
{
....
}

...

ThreadPool.QueueUserWorkItem(_ => MyMethod(1));
ThreadPool.QueueUserWorkItem(_ => MyMethod(2));
ThreadPool.QueueUserWorkItem(_ => MyMethod(3));
...
ThreadPool.QueueUserWorkItem(_ => MyMethod(42));

Outra opção é fazer MyMethod aceita um parâmetro do tipo Objecte use a segunda sobrecarga de QueueUserWorkItem:

void MyMethod(object param)
{
int value = (int)param;
....
}

...

ThreadPool.QueueUserWorkItem(MyMethod, 1);
ThreadPool.QueueUserWorkItem(MyMethod, 2);
ThreadPool.QueueUserWorkItem(MyMethod, 3);
...
ThreadPool.QueueUserWorkItem(MyMethod, 42);

1 para resposta № 2

amostra simples:

        for (int i = 0; i < 100; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(k =>
{
TestMethod(k);
}, i);
}

0 para resposta № 3

Não há nada que impeça o envio de uma lista de objetos como parâmetros de objeto; portanto, na prática, você pode passar qualquer número de parâmetros para uma função de encadeamento.


0 para a resposta № 4

você está procurando um início de thread parametrizado (exemplo abaixo)

string myUrl = "asd"
Thread t = new Thread (new ParameterizedThreadStart(FetchUrl));
t.Start (myUrl);


static void FetchUrl(object url)
{
// use url here, probably casting it to a known type before use
}

ou você pode usar tarefas encontradas em System.Threading.Tasks ..

Task.Factory.StartNew(() => {
File.WriteAllBytes(path, response);
});