Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程内的查询_C#_Asp.net_Multithreading_Linq To Entities - Fatal编程技术网

C# 线程内的查询

C# 线程内的查询,c#,asp.net,multithreading,linq-to-entities,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)

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

我不知道出了什么问题,所以任何帮助都将不胜感激。主要思想是将查询分为多个线程,因此如果我的方法错误,请告诉我。

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


我真的不知道如果没有AJAX,您将如何完成您想要完成的任务。

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

ThreadPool.QueueUserWorkItem(new WaitCallback(Osobe));
ThreadPool.QueueUserWorkItem(new WaitCallback(Tijela));
更改Osobe和Tijela的签名以接受对象 例如,公共空间(对象a)

您还需要跨线程封送调用,因为如果绑定发生在另一个线程上,我不确定webforms是否会接受


说了这么多,做了这么多,还是觉得ajax方法是最好的方法。

你应该加入线程。这就是解决方案!非常感谢。这可能就是问题所在。您能否更准确地使用AJAX来实现它。提前谢谢你!你可以用一个更新面板来做,但我从来都不喜欢它们。如果是我,我可能会用一个空的下拉框加载页面,带有某种“工作”指示器。我有一个[PageMethod]静态方法,它返回键值对象列表,让jQuery立即启动请求,返回后填充下拉列表。我使用的方法基本上就是这个网站上的方法:我尝试做一些不同于当前代码的事情的唯一原因是Internet Explorer的性能不好(其他浏览器的性能正常)。目前我正在使用AJAX控件工具包,Combobox是它的控件之一。我甚至尝试将AJAX CT组合框更改为Telerik的RadTools组合框,但结果基本相同。问题似乎在于IE不能很好地将3倍于5000条记录绑定到combobox。其他浏览器会…哎哟,一个组合框有很多记录。您可能想考虑将其更改为某种可过滤列表,如果不是为了性能,那么至少是为了可用性。作为一个用户,我不想在我的下拉列表中有那么多选项。我知道,我不想在我的组合框中也有这么多记录,但是,这正是用户想要的。