После получения ошибки исключения между потоками я посмотрел ее на MSDN .
Я попытался реализовать часть кода там, но не смог заставить Callback работать.
addItemCallback d = new addItemCallback(addItem);
это находится в методе addItem () ниже.
Я пытаюсь, чтобы список элементов добавлялся в список, в конечном итоге обновляя форму каждый раз, когда найдено одно значение, а не все из них добавляются после того, как фон завершил работу.
private void startWork()
{
progressBar1.Value = 0;
progressBar1.Maximum = 901242;
backgroundWorker1.RunWorkerAsync();
}
private void getList()
{
if (pathFound)
{
for (int i = 0; i < numberOfPaths; i++)
{
Microsoft.Win32.RegistryKey mainPath = secondaryPath.OpenSubKey("application " + Convert.ToString(i));
if (mainPath != null)
{
this.addItem((string)mainPath.GetValue("Name"));
}
backgroundWorker1.ReportProgress(i);
}
}
pathListBox.Sorted = true;
}
private void addItem(string item)
{
if (this.pathListBox.InvokeRequired)
{
//addItemCallback d = new addItemCallback(addItem);
//not sure what this callBack is, can't get it to work, Callback isnt found.
this.Invoke(d, new object[] { item });
}
else
{
this.pathListBox.Items.Add(item);
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
getList();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Visible = false;
}
РАБОТАЙТЕ ТАК ДАЛЬШЕ
Код 1. Когда я использую background_doWork и вызываю из него метод, индикатор выполнения зависает в случайных местах и перестает отвечать, при закрытии формы я получаю исключение объекта, так как закрыл форму, пока она все еще пытается делай работу.
Код 2. Когда я помещаю весь код в background_doWork, а не вызываю из него метод, индикатор выполнения будет иногда работать, каждую секунду или каждую третью попытку запуска программы, которую он завершает.
Что будет причиной этого?
----- КОД 1 -----------
public Form1()
{
InitializeComponent();
start();
}
int number = 900000;
public void start()
{
progressBar1.Value = 0;
progressBar1.Maximum = number;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
getList();
}
private void getList()
{
Microsoft.Win32.RegistryKey mainPath = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node");
for (int i = 0; i < number; i++)
{
Microsoft.Win32.RegistryKey mainPath = secondaryPath.OpenSubKey("application " + Convert.ToString(i));
if (mainPath != null)
{
this.addItem((string)mainPath.GetValue("Name"));
}
backgroundWorker1.ReportProgress(i);
}
}
private void addItem(string item)
{
try
{
if (this.listBox1.InvokeRequired)
{
this.Invoke(new Action<string>(addItem), item);
}
else
{
this.listBox1.Items.Add(item);
}
}
catch
{
MessageBox.Show("Error - Closed Object before it finished working.");
}
//this.steamGamesListBox.Sorted = true;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Visible = false;
}
------ КОД 2 --------
public Form1()
{
InitializeComponent();
start();
}
int number = 900000;
public void start()
{
progressBar1.Value = 0;
progressBar1.Maximum = number;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Microsoft.Win32.RegistryKey steamApps64 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
for (int i = 0; i < number; i++)
{
Microsoft.Win32.RegistryKey steamApps = steamApps64.OpenSubKey("Steam App " + Convert.ToString(i));
if (steamApps != null)
{
this.addItem((string)steamApps.GetValue("DisplayName"));
}
backgroundWorker1.ReportProgress(i);
}
}
private void addItem(string item)
{
try
{
if (this.listBox1.InvokeRequired)
{
this.Invoke(new Action<string>(addItem), item);
}
else
{
this.listBox1.Items.Add(item);
}
}
catch
{
MessageBox.Show("Error - Closed Object before it finished working.");
}
//this.steamGamesListBox.Sorted = true;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Visible = false;
}