クロススレッド例外エラーを受け取った後、私はMSDNでそれを調べました。クロススレッディング例外 - 呼び出しを使用
私はそこにいくつかのコードを実装しようとしましたが、コールバックを動作させることができません。
addItemCallback d = new addItemCallback(addItem);
これは以下のaddItem()メソッドにあります。
私は項目のリストをリストボックスに追加しようとしています。最終的には、バックグラウンドが完了した後にすべてが追加されるのではなく、値が見つかるたびにフォームを更新します。私はbackground_doWorkを使用して、それからメソッドを呼び出すと、プログレスバーがランダムスポットでハングアップしてフォームを閉じるには、応答を停止SO FAR
コード1.
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;
}
WORKは、私は私のようなオブジェクトの例外を取得しますまだ仕事をしようとしている間にフォームを閉じた。
コード2.メソッドを呼び出すのではなく、background_doWorkにすべてのコードを配置すると、プログレスバーが終了することがあります。
この原因は何ですか?
----- CODE 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;
}
------ CODE 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;
}
のC#/ Frameworkのバージョンを使用している追加 - これに応じて、あなたのいずれかを起動するための独自の委任を作成する必要があるか、.net4を使用してアクション – Carsten
のようなものを使用することができます:)(文字制限:Pを) – cheeseman