查询线程内部

时间:2011-03-03 23:24:42

标签: c# asp.net multithreading linq-to-entities

我有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();
    }

我不知道什么是错的,所以任何帮助都会受到赞赏。主要的想法是将查询分成线程,所以如果我的方法有误,请告诉我。

2 个答案:

答案 0 :(得分:1)

您正在启动线程,但在页面加载之前没有给他们机会完成。我不知道这会如何导致您的特定错误,但如果您的页面在线程完成之前加载,那么您肯定不会得到结果。

如果没有AJAX,我真的不知道你将如何完成你想要做的事情。

答案 1 :(得分:1)

如果你真的想用线程做,我会建议在线程池上执行查询。你可以抽象你的方法,以便在线程池方法的委托中调用它 所以我会用

替换bind
ThreadPool.QueueUserWorkItem(new WaitCallback(Osobe));
ThreadPool.QueueUserWorkItem(new WaitCallback(Tijela));

更改Osobe的签名,并将Tijela更改为接受Object eg.public void Osobe(对象a)

你还需要整理线程中的调用,因为我不确定如果绑定发生在另一个线程上,webforms是否会接受。

所有说和做的仍然觉得ajax方法是最好的前进方式。