Я буду использовать другой, вероятно, более подходящий пример для многопоточности через компонент BackgroundWorker, который является простым в использовании многопоточным инструментом. Допустим, у меня есть проект с двумя окнами, одно из которых является моим приложением, другое предназначено для использования в качестве SplashScreen во время загрузки приложения. Компонент BackgroundWorker отлично подходит для таких задач.
using System.ComponentModel.Component;
private BackgroundWorker newThread = new BackgroundWorker();
public void appForm_Load(object sender, EventArgs e) {
SplashForm sf = new SplashForm();
sf.Parent = this;
newThread.DoWork += new EventHandler(newThread_DoWork);
newThread.RunWorkerAsync(); // Here starts the thread.
sf.ShowDialog(); // Then shows your splash screen.
}
public void newThread_DoWork(object sender, DoWorkEventArgs e) {
// TODO: Place the code required by yours tasks here, or call another method to do so.
}
Это простой пример. Предполагая, что это скомпилируется, он будет выполнять ваши фоновые задачи в другом потоке, продолжая показывать вам заставку. На этом заставке вы можете разместить элемент управления ProgressBar, чтобы процесс загрузки загружался в SplashForm через метод BackgroundWorker.ProgressChanged (). Вы также можете захотеть Dispose () вашего SplashForm, когда BackgroundWorker будет сделано. Это можно сделать с помощью метода BackgroundWorker.RunWorkerCompleted ().
Следуя нашему примеру, вы должны будете взять объявление SplashForm за пределами вашего метода appForm_Load (), чтобы метод BackgroundWorker.RunWorkerCompleted () мог получить к нему доступ для целей удаления, после чего должна отображаться ваша основная форма.
Это, на мой взгляд, самый эффективный и простой способ сделать многопоточность. BackgroundWorker очень удобен для программистов, ему не нужно много заботиться о блокировке, делегатах, вызовах и обратных вызовах.
.NET Framework 4 поставляется с множеством инструментов, позволяющих упростить многопоточность: коллекции Threadsafe, параллельный LINQ и т. Д.