我讀了關於線程池的文檔,並且我寫了測試代碼來將數據加載到來自不同線程的兩個網格中。但是,有時候,只有一個網格填充,而另一個網格是空的。有時候一切正常。爲什麼? 當我使用waitall我得到這個異常:不支持WAA線程上的多個句柄的WaitAll。爲什麼我的多線程代碼填充網格有時會失敗?
private void button1_Click(object sender, EventArgs e)
{
ManualResetEvent[] mre = new ManualResetEvent[2];
mre[0] = new ManualResetEvent(false);
multhread ml = new multhread(mre[0]);
ThreadPool.QueueUserWorkItem(ml.setdatabase,1);
mre[1] = new ManualResetEvent(false);
// multhread ml2 = new multhread(mre[1]);
ThreadPool.QueueUserWorkItem(ml.setdatabase2, 2);
WaitHandle.WaitAll(mre);
dataGridView1.DataSource = ml.propdt;
dataGridView2.DataSource = ml.propdt2;
}
public DataTable propdt2 { get; set; }
public void s()
{
string constring = "DATA SOURCE=.; database=test;integrated security= true; USER ID=sa;password=123456789";
SqlCommand com = new SqlCommand();
SqlConnection con = new SqlConnection(constring);
com.Connection = con;
com.CommandText = " select * from imgtable";
SqlDataAdapter adapt = new SqlDataAdapter(com);
DataTable dt2 = new DataTable();
adapt.Fill(dt2);
propdt2 = dt2;
}
}
public class multhread
{
private ManualResetEvent _doneEvent;
public multhread(ManualResetEvent doevent)
{
_doneEvent = doevent;
}
public static DataTable dt;
public static DataTable dt2;
public DataTable propdt { get; set; }
public DataTable propdt2 { get; set; }
public void setdatabase(Object threadContext)
{
string constring = "DATA SOURCE=.; database=test;integrated security= true; USER ID=sa;password=123456789";
SqlCommand com = new SqlCommand();
SqlConnection con = new SqlConnection(constring);
com.Connection = con;
com.CommandText = " select * from imgtable";
SqlDataAdapter adapt = new SqlDataAdapter(com);
dt2 = new DataTable();
adapt.Fill(dt2);
propdt2 = dt2;
_doneEvent.Set();
// return dt2;
}
public void setdatabase2(Object threadContext)
{
string constring = "DATA SOURCE=.; database=test;integrated security= true; USER ID=sa;password=123456789";
SqlCommand com = new SqlCommand();
SqlConnection con = new SqlConnection(constring);
com.Connection = con;
com.CommandText = " select * from imgtable order by id desc ";
SqlDataAdapter adapt = new SqlDataAdapter(com);
dt = new DataTable();
adapt.Fill(dt);
propdt = dt;
_doneEvent.Set();
}
此代碼是否在Web應用程序中? – Dinesh
沒有它的勝利應用程序。 – heavy
您是否試圖理解這個理論,或者這是否意圖成爲實際的生產代碼?雖然可以通過這種方式同時執行SQL Server命令,但絕對不是推薦的方法。你在使用.NET 4.5嗎? – RickNZ