В Silverlight 4 все вызовы WCF, сделанные из потока пользовательского интерфейса, должны быть асинхронными.Это отлично.Код клиента WCF предоставляет методы и события, такие как
void GetDataAsync(SomeArgument a);
event EventHandler<GetDataCompletedEventArgs> GetDataCompleted;
Можно ли обернуть его или настроить WCF / Silverlight для генерации следующего?
void GetDataAsync(SomeArgument a, EventHandler<GetDataCompletedEventArgs>);
ВВ моем проекте я создал класс, отвечающий за все вызовы методов, который доступен для более высоких уровней (например, модель представления).Он предоставляет такие методы, как:
void GetData(SomeArgument a, Action<SomeResult> callback);
Теперь serviceClient
можно использовать повторно, поэтому мне нужно отписаться от события * Completed после завершения вызова.Мой лучший подход на данный момент заключается в следующем:
EventHandler<T> MakeHandler<T>(Action<T> callback) where T : AsyncCompletedEventArgs
{
return (sender, eventArgs) =>
{
callback(eventArgs); // perform some operations in view model
((Action)eventArgs.UserState)(); // this is to unsubscribe from event
};
}
void GetData(SomeArgument a, Action<SomeResult> callback)
{
var handler = MakeHandler<GetDataCompletedEventArgs>((s, ea) => callback(ea.Result));
serviceClient.GetDataCompleted += handler
serviceClient.GetDataAsync(a, new Action(() => serviceClient.GetDataCompleted -= handler));
}
Я бы действительно хотел избежать необходимости перепечатывать всю проводку GetData () для каждого используемого метода WCF и просто делать что-то вроде:
void GetData(SomeArgument a, Action<SomeResult> callback)
{
serviceClient.GetDataAsync(a, callback);
}