2011-03-03 38 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方法是最好的前进方式。