/ / Różnica między Threadem, ThreadPool i BackgroundWorker [zamknięte] - c #, wielowątkowość, moduł do pracy w tle, Threadpool

Różnice między wątkami, ThreadPool i BackgroundWorker [closed] - c #, wielowątkowość, backgroundworker, threadpool

i wiele razy metoda wywołania za pomocą wątku jak

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

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

i trochę czasu używam ThreadPool klasa też lubi

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

ale nie rozumiem, jaka jest różnica między wywoływaniem dowolnej metody za pomocą klasy wątku lub ThreadPool klasa

więc szukam dobrej dyskusji na temat różnicy między Thread & ThreadPool class. także musimy wiedzieć, kiedy powinniśmy użyć klasy Thread do wywołania metody i kiedy ThreadPool klasa do wywołania dowolnej metody? jeśli to możliwe, omawiaj również przykładowy kod z przykładową sytuacją.

Innym bardzo ważnym pytaniem jest to, że jeśli rozpocznę wiele wątków, wydajność mojej aplikacji spadnie lub spadnie? jeśli tak, to powiedz mi dlaczego ...?

teraz też powiedz mi, co jest BackgroundWorker klasa i czym różni się od Thread & ThreadPool klasa. jak daleko to usłyszałem BackgroundWorker klasa tworzy również osobny wątek, aby uruchomić dowolną metodę. więc przedyskutuj, czym różni się od Thread & ThreadPool klasa i kiedy należy iść BackgroundWorker klasa.

oto mały przykładowy kod 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();
}

Odpowiedzi:

19 dla odpowiedzi nr 1

ale nie rozumiem, jaka jest różnica między wywoływaniem dowolnej metody za pomocą klasy Thread lub klasy ThreadPool

Główną różnicą jest to, czy samodzielnie zarządzasz czasem życia wątku (Thread) lub skorzystasz z „puli” wątków, które już tworzy środowisko.

Za pomocą ThreadPool.QueueUserWorkItem (często) użyje wątku, który już istniejesystem. Oznacza to, że nie musisz obciążać nowego wątku - zamiast tego zestaw wątków już tam jest, a twoja praca jest wykonywana na jednym z nich. Może to być szczególnie korzystne, jeśli wykonujesz wiele operacji, które są krótkotrwałe.

Kiedy używasz new Thread, w rzeczywistości rozpakowujesz nowy wątek, który będzie istniał, dopóki Twój delegat nie zakończy jego wykonywania.

Zauważ, że od .NET 4 i 4.5 zalecam używanie Task i Task<T> typy zamiast tworzenia własnych wątków lub używania ThreadPool.QueueUserWorkItem. Te (domyślnie) używają puli wątków do wykonania, ale zapewniają wiele innych przydatnych abstrakcji, szczególnie w języku C # 5 i await/async słowa kluczowe.

teraz powiedz mi także, czym jest klasa BackgroundWorker i czym różni się od klasy Thread & ThreadPool. h

The BackgroundWorker Klasa jest abstrakcją nad pulą wątków. Wykorzystuje ThreadPool ustawiać w kolejce „pracę” (twój DoWork moduł obsługi zdarzeń), ale zapewnia także dodatkową funkcjonalność, która umożliwia wysyłanie zdarzeń postępu i zakończenia z powrotem do początkowego SynchronizationContext (w programie GUI zwykle będzie towątek interfejsu użytkownika). Upraszcza to zadania, w których chcesz zaktualizować interfejs użytkownika dla powiadomień o postępie lub zakończeniu, ponieważ „praca” w tle działa w wątku w tle.