2009-06-13 8 views
0

backgound : 클라이언트에 ADO 1.0 DBServerSyncProvider의 동기화 서비스에 의해 시작된 서버 쪽 ApplyChangeFailed 이벤트를 전달하려고합니다. 동기화 서비스 충돌 해결의 모든 코드 예제에서는 WCF를 사용하지 않으며 클라이언트가 서버 데이터베이스에 직접 연결하면이 문제가 없습니다. 그러나 DBServerSyncProvider는 헤드없는 WCF 서비스로 래핑되며 리뷰를 위해 문제가되는 데이터가 포함 된 대화 상자를 사용자에게 표시 할 수 없습니다.WCF 중첩 콜백

그래서 Sync Services가 생성 한 HTTP WCF 서비스를 TCP로 변환하고 이중 연결로 만들고 SyncConflict 개체를 수신하는 클라이언트에서 콜백 처리기를 정의하고 다음과 같은 Action 속성을 설정하는 것으로 보입니다. 그 사건.

System.InvalidOperationException을 : 현재 메시지 처리를 완료 할 때까지 응답을 수신 할 수 없기 때문에이 작업이 교착 것 내가 (콜백이 시도되기 전에) 내가 런타임 오류를 가지고 있다고했다

. 순서가 잘못된 메시지 처리를 허용하려면 ConcurrencyMode를 Reentrant 또는 Multiple을 CallbackBehaviorAttribute로 지정하십시오.

그래서 메시지가 제안하고 다중 속성으로 서비스 및 콜백 동작을 장식했습니다. 그런 다음 런타임 오류가 사라졌지 만 호출 결과가 "교착 상태"로 나타나며 결코 반환되지 않습니다. 이 문제를 해결하려면 어떻게해야합니까? 원래 서비스 호출이 반환되기 전에 클라이언트를 다시 호출하는 WCF 서비스를 가질 수 있습니까?

편집 : this이 문제의 설명이 될 수 있다고 생각하지만 올바른 해결책이 무엇인지 확실하지 않습니다.

답변

0

는 콜백이 잘 작동, 더 몇 가지를 통해이를 생각하면

class SyncRunner 
{ 
    public void RunSyncInThread() 
    { 
     MysyncAgent = new MySyncAgent(); 

     syncAgent.addUserIdParameter("56623239-d855-de11-8e97-0016cfe25fa3"); 
     Microsoft.Synchronization.Data.SyncStatistics syncStats = 
       syncAgent.Synchronize(); 
    } 
} 
1

ConcurrencyMode를 업데이트 한 후 별도의 스레드에서 콜백을 실행하려고 시도 했습니까?

This answer 다른 질문에 다른 스레드를 시작하고 콜백을 통과하는 예제 코드가 있으면 용도에 맞게 디자인을 수정할 수 있습니까?

private int kickOffSyncInSeparateThread() 
    { 
     SyncRunner syncRunner = new SyncRunner(); 
     Thread syncThread = new Thread(
       new ThreadStart(syncRunner.RunSyncInThread)); 

     try 
     { 
      syncThread.Start(); 
     } 
     catch (ThreadStateException ex) 
     { 
      Console.WriteLine(ex); 
      return 1; 
     } 
     catch (ThreadInterruptedException ex) 
     { 
      Console.WriteLine(ex); 
      return 2; 
     } 
     return 0; 
    } 

을 그리고 이것은 내 SyncRunner입니다 : 클라이언트에 별도의 스레드에서 동기화 에이전트를 시작으로

+0

I 내 게시물에 링크 뒤에 스레드 가이 문제에 대한 훌륭한 추론을 가지고 있다는 것을 깨달았다. 문제는 별도의 스레드에서 콜백을 작성해야한다는 것이 아닙니다. 서버에서 실행되므로 관련이 없습니다. 교착 상태는 클라이언트에서 발생합니다. 내 코드로 답변을 게시 할 것입니다. – cdonner