2011-03-03 2 views
0

페이지로드시 LINQ 쿼리의 데이터가로드 된 3 개의 콤보 상자가 있습니다. 문제는 쿼리가 너무 많은 데이터를 포함하기 때문에 Internet Explorer가 1 분 이상 응답을 멈추는 것입니다.스레드 내부에서 쿼리

내 생각에 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

+0

그게 해결책이야! 고맙습니다! –

답변

1

스레드를 시작하지만 페이지가로드되기 전에 완료 할 기회가 없습니다. 그 결과가 당신의 특별한 오류를 어떻게 일으키는 지 모르지만, 스레드가 완료되기 전에 페이지가로드되면 결과를 얻지 못할 것입니다.

나는 AJAX없이 당신이하려는 것을 어떻게 성취 할 수 있는지 정말로 모르겠다.

+0

아마도 그게 문제입니다. AJAX로 더 정확하게 달성 할 수 있습니까? 미리 감사드립니다. –

+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/) –

+0

+1이 문제에 대한 비동기식 솔루션입니다. – Chev

1

정말로 스레드로 수행하고 싶다면 스레드 풀에서 쿼리를 수행하는 것이 좋습니다. 이
는 그래서는 객체를 eg.public 무효 Osobe (객체를 acccept하는 Osobe의

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

변경 서명 바인드를 교체하고 Tijela 것 스레드 방식의 위임 호출되도록 당신은 당신의 방법 추상적 인 수 a)

다른 스레드에서 바인딩이 발생하는 경우 webforms가 수락할지 확실하지 않으므로 스레드를 통해 호출을 마샬링해야합니다.

모두가 말했듯이 여전히 아약스 방법이 앞으로 나아갈 수 있다고 생각합니다.

관련 문제