As a Web Developer, I’ve frequently have had the need to make asynchronical function calls.
Usually, you need to do async calls when:
- Function takes a long time to process
- There is no need to present a response to the user
In this example, I will be showing some code I use on my Facebook Application (Network Trotters) to update the users profiles.
As a quick contextual background, user profiles are cached on Facebook’s side, and periodically I need to clear the cache so it is updated. This action can take a bit of time when you have a high number of users, but it doesn’t really require any response to the user.
There are 3 main things you need to do to create an async call:
- Create a delegate with the signature you would like
- Implement a Function with the same function as the delegate
- Call the delegate
Create a delegate
public delegate void AsyncDelegate(FacebookService fbService, string connectionString);
With the code above, I hve created an async delegate that takes 2 parameters, an FacebookService class (see references below), and a connection string.
Implement a Function
The next step if to implement the function we want to call, as shown in the code below:
public void RefreshProfiles(FacebookService fbService, string connectionString) { try { //get users ids foreach (string userId in userIds) { //refresh the profile url fbService.RefreshRefUrl(string.Format("{0}?uid={1}", Resources.FbAppSettings.ProfileHandlerUrl, userId)); } } catch { //ex management. } }
This particular call is refreshing a previously set URL from Facebook’s cache. This is how I manage to refresh profiles. I call this function periodically. I keep a cache with the last time I ran it, and that way I control how often I want it to run.
Check out my previous post for more info on Facebook Profile Management.
Call Function
// Create the delegate. AsyncDelegate refreshProfileDelegate = new AsyncDelegate(profileRefresher.RefreshProfiles); // Initiate the asychronous call. IAsyncResult ar = refreshProfileDelegate.BeginInvoke(fbService, connectionString, null, null);
First step is to create a delegate,and as an input you put the previously created function.
Second step is to invoke the delegate you just created. In this example I do not receive anything back from the function, so I send callback and object as null.
References
To get more information about check out:
- Facebook Developer Toolkit .Net for documentation on the wrapper used in this post
- Network Trotters: Facebook Application
Complete Code
//Deleage definition public delegate void AsyncDelegate(FacebookService fbService, string connectionString); public class ProfileRefresher { public ProfileRefresher() { } public static void Run(FacebookService fbService, string connectionString) { //if is null we need to update if (HttpContext.Current.Cache["UpdateProfiles"] == null) { ProfileRefresher profileRefresher = new ProfileRefresher(); // Create the delegate. AsyncDelegate refreshProfileDelegate = new AsyncDelegate(profileRefresher.RefreshProfiles); // Initiate the asychronous call. IAsyncResult ar = refreshProfileDelegate.BeginInvoke(fbService, connectionString, null, null); //we set the cache HttpContext.Current.Cache.Add("UpdateProfiles", true, null, DateTime.Now.AddMinutes(60), Cache.NoSlidingExpiration, CacheItemPriority.High, null); } } public void RefreshProfiles(FacebookService fbService, string connectionString) { try { //Get user Ids - foreach (string userId in userIds) { fbService.RefreshRefUrl(string.Format("{0}?uid={1}", URL_STATIC, userId)); } } catch { //ex management. } } }