2012-06-08 3 views
0

내 검색에서이 문제에 대한 일반적인 해결책은 호출 작업이 완료되면 처리 할 이벤트 처리기를 추가하는 것입니다.IValueConverter 및 asynch DomainService 호출 문제 C#

불행히도, IValueConverter는 값을 반환해야 처리기가별로 도움이되지 않습니다. 작업이 완료 될 때까지 do/while 루프를 시도했지만 루프가 닫히지 않습니다.

또한 간단한 대기 작업을 시도했지만 여전히 null을 반환합니다. 내 DomainService가 올바른 값을 반환하지만 변환기가 결코 그것을 볼 수 없다는 것을 알고 있습니다.

이 인스턴스에서 수행 할 수있는 것이 있습니까? 작동하는 변환기를 갖게되면 앞으로 발생할 수있는 모든 문제를 제거/줄일 수 있습니다.

내 코드 :

InspectDomainContext context = new InspectDomainContext(); 
    string name; 
    InvokeOperation<string> inv; 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string id = (string)value; 
     inv = context.GetName(id); 
     inv.Completed += new EventHandler(inv_Completed); 
     // return here after the handler has completed 
     return name; 
    } 

    void inv_Completed(object sender, EventArgs e) 
    { 
     name = inv.Value; 
    } 

답변

1

(는 첫 번째 완전히 다릅니다로 새 응답!)

이 당신의 ViewModel 데이터 컨텍스트 패턴의 어떤 종류를 사용하는 가정 ... IValueConverter에서이 작업을 수행보다

는 오히려 당신이 할 수있는 ViewModel에 변환 된 값을 보관 유지하는 2 번째의 프롭퍼티를 작성합니다.

public class MyViewModel 
{ 
    private string _id; 
    public string Id 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      UpdateConvertedName(_id); 
     } 
    } 

    private void UpdateConvertedName(string id) 
    { 
     // Same as your 'Convert' code above 
    } 

    private void inv_Completed(object sender, EventArgs e) 
    { 
     Name = inv.Value;   
    } 

    public string Name { get; set; } 
} 

그래서 대신 컨버터 ID와 결합, 당신은 단지 이름에 직접 결합하는 것입니다. ID가 변경 될 때마다 Name은 비동기 적으로 업데이트됩니다. Name getter/setter에 INotifyPropertyChanged이 필요할 수도 있습니다. ViewModels를 사용하고 있다면 이미 익숙 할 것입니다.

비동기 호출에 문제가 있어도 값이 오래되거나 불완전하다는 UI 표시기를 추가 할 가치가 있습니다. 설정이 무엇인지 모르지만 이론적으로 클라이언트 시스템은 28.8 k 연결 또는 매우 느린 모바일 장치로 인해 응답 시간이 매우 느릴 수 있습니다. 하지만 그 답변은 실제로는 관련이 없습니다!

+0

와우, 훌륭한 답변! 나는 ViewModel을 사용하는 것을 생각하지 않았지만 이것이 의미가 있습니다. – xhedgepigx

+0

Phew, ViewModel을 사용하고있어 기쁩니다. 그렇지 않으면 두 가지 해답이 될 것입니다. 이것이 당신이 필요한 것을 얻을 수 있기를 바랍니다. –

0

방금 ​​기적 대신 부를 수있는 (내가 작품을이 같은 뭔가가 필요)?

return context.GetName(id.ToString()); 

그렇지 않으면, 당신은 아마 .NET 4.5 및 비동기 때까지 기다려야합니다 나는 이것이 당신이 어딘가에 '대기'포인트를 넣어 드릴 것입니다 (그것이 아직 연주하지 자신을) 그것을 이해/키워드를 기다리고 있습니다 비동기 부분이 끝날 때까지 메서드를 계속 진행하지 마십시오.

그러나 비동기 호출이 동기식 호출처럼 동작하도록 만드는 방법은 없습니다. 왜 비동기식이어야합니까?

+0

엔티티에 LINQ가있어서 자동으로 비동기 적입니다. 도메인 서비스 클래스에 대한 호출이 asynch 일 때 동기식으로 만들 수있는 방법이 너무 많습니다. 어쨌든 그것을 이해하고 있기 때문에 잘못된 것일 수 있습니다. – xhedgepigx

+0

WCF RIA Services를 사용하고 있습니까? –