使用Thread时,在执行CreateHandle()时出错,无法调用Value Dispose()

时间:2013-04-16 04:00:38

标签: c#

//这是我的代码

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按钮时,它没有错误,但在我第二次尝试时,它会出错

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

1 个答案:

答案 0 :(得分:2)

无论您目前遇到的具体问题如何,此代码都会被彻底打破。

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

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