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 ボタンを最初にクリックするとエラーは発生しませんが、2 回目の試行でエラーが発生します

実行中に値Dispose()を呼び出すことはできませんCreateHandle()。オンDesigner.cs
ですが、スレッドを使用しない場合、 btnGenSummボタンを何度もクリックしてもエラーは発生しません。

4

1 に答える 1

2

現在発生している特定の問題に関係なく、このコードは根本的に壊れています。

メイン UI スレッド以外のスレッドで UI 要素を操作することはできません。どちらのバックグラウンド スレッドも、メインの UI スレッドで実行されているかのように、UI 要素 (フォーム上のコントロールなど) と直接対話するコードを実行します。それはうまくいきません。

代わりにBackgroundWorkerコンポーネントを使用するようにコードを変更してください。これにより、UI 要素のクロススレッド アクセスが他の方法よりもはるかにエレガントに処理されます。リンクされた MSDN のドキュメントにはサンプル コードが含まれており、便利な検索機能を使用して、スタック オーバーフローに関する他の多くの質問を見つけることができます。

于 2013-04-16T04:10:39.250 に答える