2012-06-21 5 views
1

특정 사용자 지정 개체에 허용되는 최대 필드를 찾기 위해 매우 간단한 호출을 포함하려는 기존 RIA 서비스가 있습니다. 값이 자주 변경되는 경우가 드물기 때문에 필요한 경우 한 번만 호출 한 다음 클라이언트에 보관합니다. 그러나 가치를 알 필요가있을 때, 나는 즉시 그것을 사용할 것이므로 동기식으로 그것을 알아야합니다.동기식 RIA 요청 방법

나는이 코드 블록이 실행될 때 서비스가 실제로 요청을하지 않기 때문에 다음을 시도했지만 .Value은 항상 단지 0입니다. 나중에 언젠가는. 는 RIA 서비스를 사용 동기,로드 온 디맨드 서비스 요청을 만들 수있는 방법

private static readonly Lazy<int> _fieldCount = 
    new Lazy<int>(() => 
     { 
      const int TotalWaitMilliseconds = 2000; 
      const int PollIntervalMilliseconds = 500; 

      // Create the context for the RIA service and get the field count from the server. 
      var svc = new TemplateContext(); 
      var qry = svc.GetFieldCount(); 

      // Wait for the query to complete. Note: With RIA, it won't. 
      int fieldCount = qry.Value; 
      if (!qry.IsComplete) 
      { 
       for (int i = 0; i < TotalWaitMilliseconds/PollIntervalMilliseconds; i++) 
       { 
        System.Threading.Thread.Sleep(PollIntervalMilliseconds); 
        if (qry.IsComplete) break; 
       } 
      } 

      // Unfortunately this assignment is absolutely worthless as there is no way I've discovered to really invoke the RIA service within this method. 
      // It will only send the service request after the value has been returned, and thus *after* we actually need it. 
      fieldCount = qry.Value; 

      return fieldCount; 
     }); 

있습니까? 또는 다음 중 하나를 수행해야합니다. 1) 클라이언트 코드에 상수를 포함하고 변경 될 때 업데이트를 푸시합니다. 또는 2) 완전히 동기식 방식으로 호출 할 수있는 완전히 별개의 서비스를 호스팅합니까?

+0

콜백/위임자는 어떻게됩니까? –

답변

3

불행히도 WCF RIA를 동 기적으로 작동시킬 수 없습니다. Silverlight를 호스팅하는 HTML의 <object> 태그 InitParams에 값을 입력하면됩니다. 더 읽기 : http://msdn.microsoft.com/en-us/library/cc189004(v=vs.100).aspx

+0

RIA 서비스는 필자의 경우 Silverlight 호스트와 동일한 서버에 있으며, '_fieldCount'의 사용법은 InitParam의 형태에 잘 맞습니다. 세션의 진행 과정에서 가치가 바뀔 수있는 다른 문제가있는 경우 다른 솔루션에도 관심이 있습니다. 감사! –

1

나는 이전의 대답이 2 년 전 사실일지도 모른다는 것을 깨달았지만, 지금 막 발견 한 것처럼 지금은 완전히 사실이 아니다. 기다리고있는 운영자를 보아라 http://msdn.microsoft.com/en-us/library/hh156528.aspx

나는 그것이 당신이 찾고있는 정확하게 것이다라고 생각한다. 비동기 메서드 내에서 호출 할 수 있습니다 (private 비동기 void dostuff()와 같은 메서드의 시작 부분에 비동기 수정자를 사용해야합니다). 부모 메서드는 여전히 비동기이지만 작업 호출을 기다립니다.

도메인 데이터 서비스에서이 작업을한다고 가정 해 보겠습니다. 다음은 예입니다. 주 : DDS는 IEnumerable 유형을 리턴해야합니다. await를 그런 다음 기존의 비동기 RIA 서비스 방법이나 실제로 사용하는 클라이언트 메소드 내에서 해당 작업을 호출 할 수 있습니다

private Task<IEnumerable<fieldCounts>> GetCountssAsync() 
    { 
     fieldCountsEnumerable_DS _context = new fieldCountsEnumerable_DS(); 
     return _context.LoadAsync(_context.GetCountsQuery()); 
    } 

: 당신이 당신의 DDS에서 데이터를 호출하기 전에,이 같은 문제의 데이터를 검색 개인 작업 방법을 정의 :

IEnumerable<fieldCounts> fieldcnts = await GetCountssAsync(); 
enter code here 

당신이 이것을 호출하는 방법이 무엇이든간에 그 방법은 문서에서 말하는 것처럼 비동기 적이어야합니다. 그것은 호출자에게 다시 제어권을 제공해야합니다.