2017-04-01 3 views
0

비동기 적으로 IDataErrorInfo (.NET 4.0)를 사용하려고 할 때 문제가 있습니다. 이 코드는 완벽하게 작동합니다.비동기 IDataErrorInfo - WPF

EditViewModel.cs 

public class EditViewModel : CustomViewModel, IDataErrorInfo 
{ 
    string IDataErrorInfo.Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    string IDataErrorInfo.this[string propertyName] => _validationHandler.Validate(this, propertyName); 

} 

ValidationHandler.cs 

public string Validate(object currentInstance, string propertyName) 
{ 
    // BLA BLA BLA BLA BLA 

    return ReturnErrorString 

} 

내가 원하는 것은 비동기식으로 할 수 있습니다. 아래에 남기는 코드는 작동하지 않습니다. 그것은 오류 또는 아무것도 반환하지 않습니다, 내 양식이 열리지 않고 응용 프로그램이 멈 춥니 다.

private async Task<string> AsyncValidation(object currentInstance, string propertyName) 
{ 
    return await TaskEx.Run(() => 
     { 
      // BLA BLA BLA BLA BLA 

      return ReturnErrorString 
     } 
    ); 
} 

public string Validate(object currentInstance, string propertyName) 
{ 
    return AsyncValidation(currentInstance, propertyName).Result; 
} 

내가 뭘 잘못하고 있니? 당신이

+0

완료하려면 'await' 문과 동일한 스레드에서'Result' 속성 getter를 차단하여 UI 스레드를 교착 상태로 만듭니다. 귀하의 질문에는 문제를 확실하게 재현 할 수있는 좋은 [mcve]가 부족하므로 좋은 대답을 제공하는 것은 불가능합니다 (어쨌든 대답을 잘못 시도 할 수도 있음). a)'비동기'(차단하고 있다면 비동기는 아닙니다), b)'대기'할만한 이유가있는 것 같습니다 ('Task 'Run() 메소드가 리턴한다). –

+0

비동기 유효성 검사에 IDataErrorInfo를 사용하면 안됩니다.이 인터페이스로 (적절한) 비동기 유효성 검사를하기가 어렵 기 때문입니다. 적어도 INotifyDataErrorInfo를 대신 사용하십시오. – Evk

답변

1

당신은 실제로 비동기 IDataErrorInfo 인터페이스를 구현할 수 없습니다 비동기식으로 인덱서 자체가 검증 프레임 워크에 의해 기다려온되지 않는로 하지이 검증 비동기를 만들 것입니다 인덱서에 async 메소드를 호출

. 이 사실을 바꿀 수있는 방법은 없습니다. async 메소드는 끝까지 async이어야하며 차단 및 비동기 코드 (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)를 함께 사용하지 않아야합니다.

.NET Framework 4.5에 도입 된 INotifyDataErrorInfo 인터페이스를 살펴볼 수 있습니다. 이 인터페이스는 비동기 검증을 지원합니다. 자세한 내용 및 예 : https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx에 대한 TechNet 문서를 참조하십시오.

-1

Validate 기능은 다음과 같아야합니다 감사합니다 그냥있는 어느 것도 속성 및 인덱서를 정의하거나 구현 될 수 있으므로

public async string Validate(object currentInstance, string propertyName) 
{ 
    result = await AsyncValidation(currentInstance, propertyName); 
    return result; 
} 
관련 문제