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);
}