//这是我的代码

private void btnGenSumm_Click(object sender, EventArgs e)  
{  
    Thread t1 = new Thread(new ThreadStart(loadSummSales));
    Thread t2 = new Thread(new ThreadStart(showWaitMessage));
    t1.Start();
    t2.Start();  
    }      

private void showWaitMessage()  
{            
    label1.Text = "Processing please wait!";  
}      

private void loadSummSales()    
{  
    try  
    {  
        sqlConn = new SqlConnection(MyClass.GlobalConn());    

        string cmdStr = "[dbo].[GetSummary]";    

        sqlConn.Open();    

        SqlCommand cmd = new SqlCommand(cmdStr, sqlConn);    

        cmd.CommandType = CommandType.StoredProcedure;    
        cmd.Parameters.Add("@piDateFrom", SqlDbType.Int).Value = Convert.ToInt32(FromD);    
        cmd.Parameters.Add("@piDateThru", SqlDbType.Int).Value = Convert.ToInt32(ToD);  

        System.Data.DataTable dT = new System.Data.DataTable();    
        SqlDataAdapter da = new SqlDataAdapter(cmd);    
        da.Fill(dT);    
        cmd.ExecuteNonQuery();  
        dgSummSales.DataSource = dT;    

        dgSummSales.Columns["Branch"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;    
        dgSummSales.Columns["Product Amt"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;    
        dgSummSales.Columns["SERVICE Amt"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;    

        dgSummSales.Columns["Branch"].Width = 270;  
        dgSummSales.Columns["Product Amt"].Width = 98;  
        dgSummSales.Columns["SERVICE Amt"].Width = 103;  

        dgSummSales.Columns["Product Amt"].DefaultCellStyle.Format = "N2";  
        dgSummSales.Columns["SERVICE Amt"].DefaultCellStyle.Format = "N2";  

        dgSummSales.RowsDefaultCellStyle.BackColor = Color.White;  
        dgSummSales.AlternatingRowsDefaultCellStyle.BackColor = Color.Aquamarine;  

        dgSummSales.Refresh();

        label1.Text = "Sales as of " + dateTimePicker2.Value.ToString("d", System.Globalization.CultureInfo.GetCultureInfo("en-US"));
    }  

//在我第一次单击btnGenSumm按钮时,它没有错误,但在我第二次尝试时,它会出错

在执行CreateHandle()时无法调用Value Dispose() CreateHandle() Designer.cs
但是当我没有使用Thread时,我多次单击btnGenSumm按钮时没有错误。

===============>>#1 票数:2

无论您目前遇到的具体问题如何,此代码都从根本上被打破。

您不能操纵任何线程上的UI元素,而是主UI线程。 两个后台线程都执行与UI元素直接交互的代码(例如,表单上的控件),就像它在主UI线程上运行一样。 那不行。

更改代码以改为使用BackgroundWorker组件。 这比替代方案更优雅地处理UI元素的跨线程访问。 链接的MSDN文档包含示例代码,您可以通过使用方便的dandy搜索功能在Stack Overflow上找到关于它的大量其他问题。

  ask by odlan yer translate from so

未解决问题?本站智能推荐:

4回复

System.InvalidOperationException:在执行CreateHandle()时无法调用Value Dispose()

在我的Windows窗体应用程序中,客户端有时会报告一个奇怪的异常: 导致此错误的代码如下所示: DialogBox本质上是一个继承自Windows.Forms.Form的类,并且进行了一些设计更改,没有什么特别的。 异常发生在 而不是像我期望的那样在using块的末尾
2回复

使用nSubstitute时未调用抽象的Dispose方法

我有这个基础(抽象)类: 我正在用以下方法进行单元测试: 和... 我遇到的麻烦是: 实际上没有在抽象类中调用我的Dispose方法,因为它被声明为虚拟方法。 如果我删除了虚方法,那么代码将被播放。 但是,我需要将虚拟方法保留在那里,因为我需要在解决方案中的其
1回复

调用dispose时用户控件不进行dispose

我正在通过以下方式使用用户控件: 在某个时候,用户控件会触发一个事件,在该事件上主表单会做出如下反应: 但是,在调试器中签入时,登录实例仍不为null。 为什么? 我认为应该处置
2回复

线程退出时如何处理ThreadLocal值?

假设我有一次性类型: 然后我希望每个线程都有自己的这个类的本地副本,每个线程一个: 现在我想确保在线程退出之前 ,我在值上调用Dispose()如果它已创建)。 有没有办法做到这一点? 我的应用程序中的一些线程是短暂的,有些线程很长。 我想确保任何短命的人都能处理他们的价值
3回复

使用子句无法调用Dispose?

我正在使用Visual Studio 2010来定位.NET 4.0 Client Profile。 我有一个C#类来检测给定进程何时启动/终止。 为此,该类使用ManagementEventWatcher,初始化如下; query , scope和watcher是类字段: 事件E
1回复

为什么在使用这个工作单元时Dispose被调用两次?

使用这个通用存储库和工作单元框架与EF6,每当我完成一个工作单元操作时,我的控制器中的Dispose方法被调用两次。 为什么是这样? 我希望它只能被调用一次。 这是设置: Bootstrapper类 - 设置Autofac IoC: 控制器: 在阅读另一篇文章时,
1回复

如何在C#中停止相机? 使用grabber.dispose时出错

我正在用C#开发一个项目。 我有一个停止按钮,它调用grabber.dispose,但是当我单击它时,应用程序崩溃了,并出现以下错误: 对象引用未设置为对象的实例。 FrameGrabber函数应停止程序并将其移至当前帧。 捕获采集卡: 相机拍摄功能:
2回复

解决调用线程无法访问该对象,因为其他线程拥有该对象,而未使用Dispatcher时出错

有没有办法解决此错误“调用线程无法访问该对象,因为其他线程拥有该对象”而不使用调度程序,因为当代码需要较长的处理时间时,调度程序会导致UI冻结,是否还有其他方法可以解决? 而不导致UI冻结
1回复

调用线程无法访问该对象,因为其他线程拥有该对象时出错

我在一个.cs文件中有消息框,并且我想清除“确定”按钮单击后在另一个.cs文件中的文本框。 我用过 解决线程问题。但是它并没有帮助我。它仍然显示相同的错误。 任何帮助表示赞赏。 更新: 您好,我也更新了我的代码,但它不会更改文本框的值。它保持原样。我在进度屏幕的上传屏幕
1回复

确保“处理结束时”调用Dispose

有一个可能共享的资源X 与前景线程相关联 ,该资源由两个实例(Y,Z)使用并作为依赖项提供。 因为X可能是共享的,所以不能由使用站点(Y或Z)处置。 显而易见的解决方案是确保X不再使用后“在某个适当的时间” 手动处置:在这种情况下,可以假定这意味着X不再是可广泛到达的。 但是,在这种情