2011-02-02 8 views
1

클라이언트 연결을 유지하는 데 너무 오래 걸리는 매우 긴 실행 쿼리가 있습니다. 내 DomainService에 대한 호출을 만들고 새 작업자 스레드를 만든 다음 서비스에서 반환하여 내 클라이언트가 장기 실행 쿼리가 완료되었는지 확인하기 위해 폴링을 시작할 수 있도록하려고합니다.Silverlight 4 Ria 서비스 및 다중 스레드

문제는 내 호출 스레드가 즉시 종료 되었기 때문에 원래 스레드가 종료 될 때 ObjectContext가 삭제 된 이후에 내 작업자가 모든 엔티티에 액세스하려고 할 때 예외가 발생한다는 것입니다.

MyDomainContext context = new MyDomainContext(); 
context.SearchAndStore(_myParm, SearchQuery, 
    p => { 
     if (p.HasError) { // Do some work and return to start 
     }     // polling the server for completion... 
    }, null); 

서버의 입력 방법 : 여기

[Invoke] 
public int SearchAndStore(object parm) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(SearchThread)); 
    t.Start(parms);  
    return 0; 
    // Once this method returns, I get ObjectContext already Disposed Exceptions 
} 

가 함께 호출되는 WorkerProc 방법입니다 여기

나는 새로운 상황을 만들어 내 실버 클라이언트에서 호출하는 방법입니다 새 스레드. 최대한 빨리 내 query1 객체를 반복하려고하면 ObjectContext가 이미 Disposed 예외가 발생합니다.

private void WorkerProc(object o) 
{ 
    HashSet<long> excludeList = new HashSet<long>(); 

    var query1 = from doc in this.ObjectContext.Documents 
     join filters in this.ObjectContext.AppliedGlobalFilters 
      .Where(f => f.FilterId == 1) 
     on doc.FileExtension equals filters.FilterValue 
     select doc.FileId; 

    foreach (long fileId in query1) // Here occurs the exception because the 
    {        // Object Context is already disposed of. 
     excludeList.Add(fileId); 
    } 
} 

어떻게 이런 일이 발생하지 않도록 할 수 있습니까? 새 스레드에 대한 새 컨텍스트를 만드는 방법이 있습니까? 나는이 하나에 정말로 붙어있다.

감사합니다.

+0

중복 - http://stackoverflow.com/questions/4869346/polling-pattern-for-silverlight-4-wcf-ria-services/4879483 # 4879483 – jweyrich

+0

내가 뭐라 말할 수 있니, 나는 필사적이다! – Scott

+2

이것이 실질적으로 다른 경우가 아니면 새로운 질문을 게시하는 대신 원래 질문을 편집해야합니다. 참조 - http://stackoverflow.com/questions/4869346/polling-pattern-for-silverlight-4-wcf-ria-services – ChrisF

답변

0

WCF RIA를 사용하고 있으므로. WCF 서비스를 소비

  • 은 WCF 웹 서비스
  • 실버 라이트 클라이언트 : 나는 당신이 두 부분을 구현한다고 가정합니다.

이렇게 두 가지 응용 프로그램이 있음을 의미합니다. IIS에서 실행되는 서비스와 웹 브라우저에서 실행되는 Silverlight. 이러한 응용 프로그램에는 서로 다른 수명주기가 있습니다. Silverlight 응용 프로그램은 웹 페이지에로드 될 때부터 시작되어 페이지가 닫힐 때 (또는 예외가 발생하면) 종료됩니다. 반면에 (서버 측에서) WCF 웹 서비스의 수명은 상당히 유사합니다. 응용 프로그램은 서비스가 요청 될 때부터 시작하여 요청이 완료되면 종료됩니다.

SearchAndStore 메서드가 완료되면 서버 요청이 완료됩니다. 따라서이 특정 메서드가 시작되면 백그라운드에서 (서버에서) 실행을 시작하는 스레드를 만들고 메서드가 몇 줄에 끝나기 쉬운 실행을 계속합니다.

맞으면이 작업을 수행 할 필요가 없습니다. 스레드를 사용하지 않고 메서드를 호출 할 수 있습니다. 이론적으로 응답하는 데는 시간이 걸릴지는 중요하지 않습니다. 이는 Silvelight 어플리케이션 (클라이언트에서)이 기다리지 않기 때문입니다. Silverlight에서 모든 작업은 비동기 적입니다 (즉, 스레드가 자체 스레드에서 실행 중임을 의미합니다). 따라서 클라이언트에서 서비스 메서드를 호출하면 콜백이 호출 될 때까지 기다려야합니다.

실제로 오랜 시간이 걸릴 경우 Silverlight 클라이언트와 웹 서버 간의 연결을 오래 유지할 수있는 메커니즘을 찾을 가능성이 더 큽니다. 서비스 구성을 수정하여 생각합니다. https://github.com/hmadrigal/CodeSamples/tree/master/wcfria/SampleWebApplication01 당신이 클라이언트와 서버 측에서 다른 시간을 볼 수있는 샘플 : 여기

은 무슨 말인지의 샘플입니다. 버튼을 클릭하고 서버에서 응답을 받으려면 30 초 동안 기다려야합니다.

나는,이 도움이 안부, 허버트 희망

관련 문제