Чтобы ответить на ваш вопрос в заголовке, да "нормальные" темы могут действовать как BackgroundWorker
темы.Вам просто нужно создать больше кода для проводки самостоятельно.
Я написал простое приложение для сканирования моей музыкальной коллекции с использованием созданного вручную потока.Основное тело потока - это метод, который перебирает все папки в указанном корне и запускает событие каждый раз, когда встречает папку, содержащую некоторые mp3-файлы.
Я подписываюсь на это событие в основномформы моего приложения и обновите DataGridView с новой информацией.
Таким образом, поток запускается с помощью следующего кода:
this.libraryThread = new Thread(new ThreadStart(this.library.Build)) { IsBackground = true };
// Disable all the buttons except for Stop which is enabled
this.EnableButtons(false);
// Find all the albums
this.libraryThread.Start();
Метод, предоставленный ThreadStart
, выполняет некоторую служебную работу изатем вызывает метод, который выполняет эту работу:
private void FindAlbums(string root)
{
// Find all the albums
string[] folders = Directory.GetDirectories(root);
foreach (string folder in folders)
{
if (this.Stop)
{
break;
}
string[] files = Directory.GetFiles(folder, "*.mp3");
if (files.Length > 0)
{
// Add to library - use first file as being representative of the whole album
var info = new AlbumInfo(files[0]);
this.musicLibrary.Add(info);
if (this.Library_AlbumAdded != null)
{
this.Library_AlbumAdded(this, new AlbumInfoEventArgs(info));
}
}
this.FindAlbums(folder);
}
}
Когда этот метод завершает работу, запускается окончательное событие LibraryFinished
.
Я подписываюсь на эти события в основной форме:
this.library.Library_AlbumAdded += this.Library_AlbumAdded;
this.library.Library_Finished += this.Library_Finished;
и в этих методах добавьте новый альбом в сетку:
private void Library_AlbumAdded(object sender, AlbumInfoEventArgs e)
{
this.dataGridView.InvokeIfRequired(() => this.AddToGrid(e.AlbumInfo));
}
и завершите работу (что включает кнопки и т. Д.):
private void Library_Finished(object sender, EventArgs e)
{
this.dataGridView.InvokeIfRequired(() => this.FinalUpdate());
}
Как вы можетевидите, это большая работа, которая была бы намного проще, если бы я использовал BackgroundWorker
.