Most RIA technologies today use an asynchronous model to communicate with the server, primarily to keep the UI responsive no matter what the server is doing. This principle is also known as the Hollywood principle. Don’t call us, we call you means that instead of continuously polling, the server calls back when the operation finished. In order to be notified when the server finished its job, callbacks are used.
For instance in Silverlight this leads to code like this
void ClickLoad()
{
LoadCustomer(1,
(result) =>
{
// Process result
},
(error) =>
{
// Process error
});
}
void LoadCustomer(int id, Action<Customer> success, Action<Exception> error)
{
LoadFromServer("select * from customers where id = " + id,
(result) =>
{
success(result[0] as Customer);
},
(exp) =>
{
error(exp);
});
}
void LoadFromServer(string query, Action<List<object>> success, Action<Exception> error)
{
server.LoadCompleted += (s, e) =>
{
if (e.Error != null)
error(e.Error);
else
success(e.Data);
};
server.LoadAsync(query);
}
Not very nice, is it? In jquery we find a similar pattern.
$.ajax({
url: 'ajax/load.html',
data: "query=1"
success: function(result) {
// Process result
}
error: function(XMLHttpRequest, textStatus, errorThrown) {
// Process error
}
});
Usually an application consists of several layers. In that case the callbacks have to be routed back to the original caller, leading to code that is neither easy to read nor easy to maintain.
From what is already visible, it is very likely that Silverlight and WinRT are going to have great overlap. The combination of XAML, C# and WinRT plus the tooling will be very familiar to all Silverlight users.
That means, it is likely that the asynchronous programming model will be the predominant model for client/server communication for Windows Metro style apps. In order to simplify this, C#5.0 is going to include the await/async keywords, that will make callback chaining obsolete.
Example:
void ClickLoad()
{
try
{
Customer result = await LoadCustomer(1);
// Process result
}
catch(Exception e)
{
// Process error
}
}
async Task<Customer> LoadCustomer(int id)
{
List<object> result = await LoadFromServer("select * from customers where id = " + id);
return result[0] as Customer;
}
async Task<List<object>> LoadFromServer(string query)
{
return await server.LoadAsync(query);
}
This is much cleaner than the examples above. Actually it is a synchronous programming model supporting an asynchronous runtime model. As asynchronous calls are very common in RIA applications the async/await keywords are going to change the way we program async calls in the near future, leading to code that is easier to develop and maintain.
I can’t await async in C# 5.0 😉