调用线程无法访问此对象,因为另一个线程拥有它“异常

时间:2013-09-08 18:11:48

标签: c# multithreading winforms

嗨,我是第一次在Threads上工作,不确定我是否正确 我收到错误说:

调用线程无法访问此对象,因为另一个线程拥有它“exception

   private void ImportProductStatsButtonClick(object sender, EventArgs e)
    {
        // Get the currently selected manufacturer from the combo box
        var selected = comboBoxCorporation.SelectedItem;
        buttonProductStatsAndRetailerStats.Enabled = false;
        buttonSummariseRetailerStats.Enabled = false;
        buttonSummariseProductStats.Enabled = false;
       // Do we have one?
        if (selected != null)
        {
            // Extract the combo record
            var corporation = (ComboBoxCorporrationItem)selected;

            // Do we have one?
            if (corporation.Corporation != null)
            {
                // yes
                // Make this on a seperate thread so that the UI continues to work
                var thread = new Thread(MigrateProductStats);
              thread.Start(corporation.Corporation.Id); // This enables me to pick the manufacturer that we are summarizing for
             }
        }

    }

 private void MigrateProductStats(object corporationIdObj)
    {
       // after thread completion I need to Enable my buttons.
        buttonProductStatsAndRetailerStats.Enabled = true;
        buttonSummariseProductStats.Enabled = true;

    }

2 个答案:

答案 0 :(得分:2)

尝试:

private void MigrateProductStats(object corporationIdObj)
{
    Invoke(new Action(() =>
    {
       // after thread completion I need to Enable my buttons.
       buttonProductStatsAndRetailerStats.Enabled = true;
       buttonSummariseProductStats.Enabled = true;
    });
}

答案 1 :(得分:0)

Control.Invoke更好的是使用BackgroundWorker为您处理线程。它在UI线程上生成进度和完成事件,以简化UI更新。

如果您使用的是C#5,还可以使用async开始后台处理,await可以在处理完成时使用UI更新。