0

//这是我的代码

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()。onDesigner.cs
但是当我不使用 Thread 时,当我 btnGenSumm多次单击按钮时它没有错误。

4

1 回答 1

2

无论您目前遇到什么具体问题,这段代码基本上都被破坏了。

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

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

于 2013-04-16T04:10:39.250 回答