비동기 적으로 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;
}
내가 뭘 잘못하고 있니? 당신이
완료하려면 'await' 문과 동일한 스레드에서'Result' 속성 getter를 차단하여 UI 스레드를 교착 상태로 만듭니다. 귀하의 질문에는 문제를 확실하게 재현 할 수있는 좋은 [mcve]가 부족하므로 좋은 대답을 제공하는 것은 불가능합니다 (어쨌든 대답을 잘못 시도 할 수도 있음). a)'비동기'(차단하고 있다면 비동기는 아닙니다), b)'대기'할만한 이유가있는 것 같습니다 ('Task 'Run() 메소드가 리턴한다). –
비동기 유효성 검사에 IDataErrorInfo를 사용하면 안됩니다.이 인터페이스로 (적절한) 비동기 유효성 검사를하기가 어렵 기 때문입니다. 적어도 INotifyDataErrorInfo를 대신 사용하십시오. – Evk