2014-09-17 2 views
0

내 응용 프로그램에서 76 체크 박스가 있습니다. 그리고 나는 그 체크 박스들 중 하나가 체크되었을 때 데이터베이스로부터 몇몇 값들을 읽고 싶다. 이 값을 읽으려면 확인란이 선택 될 때마다 배경 작업자를 만듭니다.C# EntityException 사용자 코드에 의해 처리되지 않았습니다

이 확인란을 하나씩 선택하면 문제가 없습니다. 하지만 일단 그들을 모두 확인하면 데이터베이스 코드가 EntityException을 던져 버린다.

private void checkBox_CheckedChanged(object sender, EventArgs e) 
      { 
       BackgroundWorker worker1 = new BackgroundWorker(); 
       worker1.DoWork += new DoWorkEventHandler(worker1_DoWork); 
       worker1.RunWorkerAsync(sender); 

      } 

void worker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      if (((CheckBox)e.Argument).Checked == true) 
      { 
      ....Some Codes 
       var vv = (from value in d.tblValue join addres in d.tblAddres on value.AddresID equals addres.ID where value.AddresID == addresID && value.LoopDate >= startDate && value.LoopDate<= finishDate orderby value.LoopDate select new { value, addres }).ToList(); 
      ....Some Codes 
      } 
     } 

데이터베이스에 너무 많은 부하가 걸리므로이 오류가 발생합니까?

+0

배경 작업자와 함께 무엇을하려합니까? 76 명의 개별 배경 근로자를 확보하는 것이 교착 상태와 눈물로 이어질 경로로 보입니다. 또한 예외 메시지는 무엇입니까? –

+0

76 명의 별도의 배경 작업자 대신에 무엇을해야합니까? 예외입니다. 기본 공급자가 열지 못했습니다. – MOD

답변

1

이전에 생성 된 DbContext (변수 d)을 다시 사용하는 것처럼 보입니다. 이는 반드시 스레드로부터 안전하지는 않습니다. worker1_DoWork 메서드 내에 새 DbContext을 새로 만드십시오 (단일 인스턴스를 다시 사용하지 마십시오).

void worker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    if (((CheckBox)e.Argument).Checked == true) 
    { 
    ....Some Codes 

     using(var db = new MyFooEntities()) 
     { 
      var vv = (from value in db.tblValue 
         join addres in db.tblAddres on value.AddresID equals addres.ID 
         where value.AddresID == addresID && 
          value.LoopDate >= startDate && 
          value.LoopDate<= finishDate 
         orderby value.LoopDate 
         select new { value, addres }).ToList(); 
     } 

    ....Some Codes 
    } 
} 
관련 문제