繁体   English   中英

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

[英]Value Dispose() cannot be called while doing CreateHandle() Error when Using Thread

//这是我的代码

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按钮时没有错误。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM