2011-03-03 58 views
0

我有3個組合框在加載頁面時加載了來自LINQ查詢的數據。問題是查詢包含太多數據,導致Internet Explorer停止響應超過一分鐘。在線程內部查詢

由於有3個查詢,我的想法是將它們放在3個不同的線程中,但問題是最後我得到的唯一一個錯誤是:「DataSource和DataSourceID都在'cbOrganizator'上定義。一個定義「。

cbOrganizator是一個組合框。

下面是代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Bind(); 
} 

public void Osobe() 
    { 
     PravosudnaAkademijaEntities db = new PravosudnaAkademijaEntities(); 

     var osoba = from o in db.osobas 
        orderby o.osoba_prezime 
        select new { o.osoba_id, imePrezime = o.osoba_prezime + " " + o.osoba_ime + " | " + o.tijelo.tijelo_naziv + " | " + o.radno_mjesto.rm_naziv_m }; 

     cbPolaznik.DataSource = osoba; 
     cbPolaznik.DataTextField = "imePrezime"; 
     cbPolaznik.DataValueField = "osoba_id"; 
     cbPolaznik.DataBind(); 
     cbPolaznik.Items.Insert(0, " "); 

     cbPredavac.DataSource = osoba; 
     cbPredavac.DataTextField = "imePrezime"; 
     cbPredavac.DataValueField = "osoba_id"; 
     cbPredavac.DataBind(); 
     cbPredavac.Items.Insert(0, " "); 

     cbAOM.DataSource = osoba; 
     cbAOM.DataTextField = "imePrezime"; 
     cbAOM.DataValueField = "osoba_id"; 
     cbAOM.DataBind(); 
     cbAOM.Items.Insert(0, " "); 
    } 

    public void Tijela() 
    { 
     PravosudnaAkademijaEntities db = new PravosudnaAkademijaEntities(); 

     var tijelo = from t in db.tijeloes 
        orderby t.tijelo_naziv 
        select new { t.tijelo_id, sve = t.tijelo_naziv + " | " + t.mjesto.zupanija_drzava.zupanija_naziv }; 

     cbOrganizator.DataSource = tijelo; 
     cbOrganizator.DataTextField = "sve"; 
     cbOrganizator.DataValueField = "tijelo_id"; 
     cbOrganizator.DataBind(); 
     cbOrganizator.Items.Insert(0, " "); 
    } 

    public void Bind() 
    { 
     Thread tOsobe = new Thread(Osobe); 
     tOsobe.Start(); 
     Thread tTijela = new Thread(Tijela); 
     tTijela.Start(); 
    } 

我不知道什麼是錯了,所以任何幫助,將不勝感激。主要想法是將查詢分隔成線程,所以如果我的方法是錯誤的,請讓我知道。

+1

你應該加入線程。 – adt 2011-03-03 23:52:47

+0

這就是解決方案!謝謝! – 2011-03-04 00:04:22

回答

1

您正在啓動線程,但沒有給他們在加載頁面之前完成的機會。我不知道如何導致你的特定錯誤,但如果你的頁面在線程完成之前加載,那麼你絕對不會得到結果。

我真的不明白你將如何在沒有AJAX的情況下完成你想要做的事情。

+0

這可能是問題所在。你能否更精確地用AJAX來完成它。先謝謝你! – 2011-03-03 23:55:02

+1

你可以用更新面板來做,但我從來不喜歡它們。如果是我,我可能會加載一個空的下拉框,帶有某種「工作」指示器的頁面。我有一個[PageMethod]靜態方法,返回鍵值對象列表,並讓jQuery立即發起請求,並在返回時填充下拉列表。我使用的方法基本上是這個網站的方法:[http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/](http:/ /encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/) – 2011-03-03 23:59:58

+0

+1這是一個很好的異步解決方案。 – Chev 2011-03-04 00:12:25

1

如果你真的想用線程來做,我會建議在線程池上執行查詢。你可以抽象的方法,以便它是所謂的線程池方法的委託
所以我會Osobe的

ThreadPool.QueueUserWorkItem(new WaitCallback(Osobe)); 
ThreadPool.QueueUserWorkItem(new WaitCallback(Tijela)); 

變化簽名取代綁定,並Tijela到acccept一個對象 eg.public無效Osobe(對象a)

您還需要在整個線程中編組調用,因爲我不確定webforms是否會在另一個線程上發生綁定時接受它。

所有說的和做的仍然覺得ajax方法是最好的前進方式。