/ / Diferença entre Thread, ThreadPool & BackgroundWorker [closed] - c #, multithreading, backgroundworker, threadpool

Diferença entre Thread, ThreadPool & BackgroundWorker [closed] - c #, multithreading, backgroundworker, threadpool

Eu muitas vezes chamada método com a ajuda de discussão como

static void Main( string[] args )
{
Thread t = new Thread( MyFunction );
t.Start();
}

static void MyFunction()
{
//code goes here
}

e algum tempo eu uso ThreadPool classe também gosto

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
MyFunction();
}, null);

mas eu não entendo qual é a diferença entre chamar qualquer método com a ajuda de classe de thread ou ThreadPool classe

então eu estou procurando uma boa discussão sobre qual é a diferença entre Thread e ThreadPool class.also precisa saber quando devemos usar a classe Thread para chamar um método e quando ThreadPool classe para chamar qualquer método? se possível, discutir também com código de amostra com situação de amostra.

Outra questão muito importante é que, se eu iniciar vários threads, o desempenho do meu aplicativo ficará baixo ou ruim? se sim, então me diga porque ...?

agora também me diga o que é BackgroundWorker classe e como ela é diferente da Thread & ThreadPool classe. até onde eu ouvi isso BackgroundWorker class também cria um thread separado para executar qualquer método. por favor, discuta como é diferente do Thread & ThreadPool classe e quando se deve ir para BackgroundWorker classe.

aqui é pequeno código de amostra de BackgroundWorker

private void button1_Click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();

// this allows our worker to report progress during work
bw.WorkerReportsProgress = true;

// what to do in the background thread
bw.DoWork += new DoWorkEventHandler(
delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;

// do some simple processing for 10 seconds
for (int i = 1; i <= 10; i++)
{
// report the progress in percent
b.ReportProgress(i * 10);
Thread.Sleep(1000);
}

});

// what to do when progress changed (update the progress bar for example)
bw.ProgressChanged += new ProgressChangedEventHandler(
delegate(object o, ProgressChangedEventArgs args)
{
label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
});

// what to do when worker completes its task (notify the user)
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
delegate(object o, RunWorkerCompletedEventArgs args)
{
label1.Text = "Finished!";
});

bw.RunWorkerAsync();
}

Respostas:

19 para resposta № 1

mas eu não entendo qual é a diferença entre chamar qualquer método com a ajuda de classe de thread ou classe ThreadPool

A principal diferença é se você gerencia a vida útil da linha (Thread), ou você aproveita o "pool" de threads que o framework já cria.

Usando ThreadPool.QueueUserWorkItem irá (freqüentemente) usar um thread que já existeo sistema. Isso significa que você não tem a sobrecarga de girar um novo thread - em vez disso, um conjunto de threads já está lá, e seu trabalho é executado apenas em um deles. Isso pode ser especialmente benéfico se você estiver fazendo muitas operações que são de curta duração.

Quando você usa new Thread, você realmente cria um novo thread que irá viver até que seu delegado conclua sua execução.

Observe que, a partir do .NET 4 e 4.5, eu recomendaria usar o Task e Task<T> tipos, em vez de criar seus próprios segmentos ou usar ThreadPool.QueueUserWorkItem. Estes (por padrão) usam o pool de threads para executar, mas fornecem muitas outras abstrações úteis, especialmente com C # 5 e await/async palavras-chave.

agora também me diga o que é a classe BackgroundWorker e como ela é diferente da classe Thread & ThreadPool. h

o BackgroundWorker class é uma abstração sobre o pool de threads. Ele usa o ThreadPool fazer fila de "trabalho" (seu DoWork manipulador de eventos), mas também fornece funcionalidade extra que permite que os eventos de progresso e conclusão sejam lançados de volta SynchronizationContext (que, em um programa GUI, normalmente será othread da interface do usuário). Isso simplifica as tarefas em que você deseja atualizar uma interface do usuário para notificações de progresso ou conclusão, já que o "trabalho" em segundo plano está sendo executado em um thread de segundo plano.