C# 跨线程异常-使用调用
在收到跨线程异常错误后,我在 我尝试在那里实现一些代码,但无法使回调正常工作C# 跨线程异常-使用调用,c#,progress-bar,backgroundworker,multithreading,registrykey,C#,Progress Bar,Backgroundworker,Multithreading,Registrykey,在收到跨线程异常错误后,我在 我尝试在那里实现一些代码,但无法使回调正常工作 addItemCallback d = new addItemCallback(addItem); 它位于下面的addItem()方法中 我试图让一个项目列表将它们自己添加到一个列表框中,最终在每次发现一个值时更新表单,而不是在后台工作完成后添加所有项目 private void startWork() { progressBar1.Value = 0; progressBar1.M
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;
}
private void startWork()
{
progressBar1.值=0;
progressBar1.最大值=901242;
backgroundWorker1.RunWorkerAsync();
}
私有void getList()
{
如果(路径发现)
{
for(int i=0;i
工作至今
代码1。当我使用后台工作并从中调用一个方法时,progressbar会随机挂起并停止响应,在关闭窗体时,我会收到一个对象异常,因为我在窗体仍在尝试工作时关闭了窗体
代码2。当我将所有代码放在后台工作而不是从中调用方法时,进度条有时会工作,每秒钟或每三次尝试运行它完成的程序
这是什么原因造成的
-----代码1-----------
public Form1()
{
初始化组件();
start();
}
整数=900000;
公开作废开始()
{
progressBar1.值=0;
progressBar1.最大值=数量;
backgroundWorker1.RunWorkerAsync();
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
getList();
}
私有void getList()
{
Microsoft.Win32.RegistryKey mainPath=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@“软件\Wow6432Node”);
for(int i=0;i
------代码2--------
public Form1()
{
初始化组件();
start();
}
整数=900000;
公开作废开始()
{
progressBar1.值=0;
progressBar1.最大值=数量;
backgroundWorker1.RunWorkerAsync();
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
Microsoft.Win32.RegistryKey steamApps64=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@“SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”);
for(int i=0;i
您要么需要定义自定义委托类型(您的addItemCallback
),要么只需使用通用的操作
委托:
private void addItem(string item)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action<string>(addItem), item);
return;
}
this.pathListBox.Items.Add(item);
}
private void addItem(字符串项)
{
if(this.invokererequired)
{
本.开始激活(新操作(附加项),项目);
返回;
}
T
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;
}
private void addItem(string item)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action<string>(addItem), item);
return;
}
this.pathListBox.Items.Add(item);
}