2010-05-25 5 views
0

나는 usr_OK 매개 변수를 변경해야합니다 실버 라이트 3와 WCF 서비스 방법 동기/비동기

private bool usr_OK = false; 

clientService.CheckUserMailAsync(this.mailTF.Text); 


if (usr_OK == true) 
{ isValidationOK = true; } 
else { isValidationOK = false; MessageBox.Show("User already exists.", "User registered succes!", MessageBoxButton.OK); } 

CheckUserMail

를 WCF 서비스 메서드를 호출에 문제가 있습니다. 그러나 다른 스레드에서 실행되며 IF 블록이 시작되기 전에 usr_OK 매개 변수가 변경되지 않습니다. thread.join을 사용해 보았습니다. 응용 프로그램이 정지되었으며 다른 작업을 수행 할 수 없습니다. 제발 도와주세요 ... WCF 메서드가 param usr_OK를 반환 할 때까지 기다릴 수는 있습니다. 귀하의 질문에 CheckUserMailCompletedEvent

에 대한 이벤트 처리기에서
clientService.CheckUserMailCompleted += new EventHandler<CheckUserMailCompletedEventArgs> (clientService_CheckUserMailCompleted); 
clientService.CheckUserMailAsync(this.mailTF.Text); 


void clientService_CheckUserMailCompleted(object sender, CheckUserMailCompletedEventArgs e) { 
    if (usr_OK == true) { 
     isValidationOK = true; 
    } 
    else { 
     isValidationOK = false; 
     MessageBox.Show("User already exists.", "User registered success!", MessageBoxButton.OK); 
    } 
} 

답변

1

바인딩 : 는 WCF에 막지 마십시오 호출합니다. 그들은 이유 때문에 그것을 어렵게 만듭니다. 당신이 시도해도 막을 수는 없지만 ...하지 마세요.

정교화 : Silverlight의 작동 모드는 비동기 성입니다. 이것은 Silverlight에서 개발할 때 익숙해 져야하는 것입니다. 그들은 당신이 무엇이든을 막는 것을 정말로 어렵게 만듭니다.

이것은 좋은 생각입니다. WCF 서비스 호출과 같은 결과를 차단하면 궁극적으로 사용자 스레드가 차단됩니다. 개발자에게 익숙해 져야하지만 다시 익숙해 져야합니다.

var theResult = clientService.DoSomething(foo); 
Process(theResult); 

가이 같은 것 (비동기)를 다시 작성하는 방법 :

clientService.DoSomethingCompleted += (sender, args) => Process(args.Result); 
clientService.DoSomethingAsync(foo); 

촬영하기

당신이 (동기) 같이 가고 싶어 코드가 있다고 가정하자 그것은 한 걸음 더 나아가, 나는 인터페이스로서 내 서비스를 추상화하고 싶다. (그래서 나는 테스트 할 때 그들을 대체 할 수있다. 또는 개발 도중 독립형 모드로 실행한다.)

public interface IMyService 
{ 
    void DoSomething(string input, Action<string> whenComplete); 
} 

나는 위의 비동기 코드 같은 서비스를 구현하고, 내가 그것을 호출 할 때 다음, 그것은 매우 깨끗하고 간단하다 :이처럼 보이는 인터페이스를 만들 수있는 기회가 있음을 취할

myService.DoSomething(foo, Process); 

시스템의 상당 부분이 비동기 코드 기반으로 변형되지만 기대치를 다시 조정해야 할 수도 있습니다.

+0

정상적으로 작동합니다. 그러나 방법을 끝내기를 기다리는 방법이 있습니다. 실은 솔기가 작동하지 않습니다. – Rafal

+0

개인 AutoResetEvent를 사용하고 싶습니다. m_autoResetEvent = new AutoResetEvent (false); – Rafal

+0

이것은 실버 라이트가 작동하는 방식입니다. 동기식 웹 서비스 호출은 설계 상 지원되지 않습니다. –

2

가장 직접적인 대답을 usr_OK 변수를 확인하는 코드

+0

감사합니다 ... 지금 이해합니다 :) – Rafal

관련 문제