this.picasaService.AcynOperationCompleted += new AsyncOperationCompletedEventHandler(this.OnDone);
     this.picasaService.AcynOperationProgress += new AsyncOperationProgressEventHandler(this.OnProgress);
QueryFeedAsync, and it is used in the Photobrowser.cs file in the following method:
      public void StartQuery(string uri, string albumTitle)
      {
          UserState us = new UserState();
          this.states.Add(us);
          us.opType = UserState.OperationType.query;
          us.filename = albumTitle;
          this.picasaService.QueryFeedAync(new Uri(uri), DateTime.MinValue, us);
      }
      
UserState object to remember what kind of operation it was (in the above sample this is indicated with the UserState.OperationType.query), as well to realize if the callback was actually meant for the object that received it. 
This is due to the fact that there are several forms open that all share the same service. Each of these forms adds their event handlers as in the sample code above. This means that the SDK will notify all open forms of progress reports. To distinguish that a given event is arriving at the correct form, the forms create UserState objects, and remember those in the states variable. 
An alternative solution would have been to just create a new service object per form, that would avoid this complication, but use more resources. 
        private void OnProgress(object sender, AsyncOperationProgressEventArgs e)
        {
            if (this.states.Contains(e.UserState as UserState) == true)
            {
              this.progressBar.Value = e.ProgressPercentage;
            }
        }
   	
	
        private void OnDone(object sender, AsyncOperationCompletedEventArgs e)
        {
            UserState ut = e.UserState as UserState;
            if (this.states.Contains(ut) == false)
                return;
            this.states.Remove(ut);
        
            if (e.Error == null)
            {
               
        if (ut.opType == UserState.OperationType.query ||
                    ut.opType == UserState.OperationType.queryForBackup)
                {
                    if (e.Feed != null)
                    {
                        this.photoFeed = e.Feed as PicasaFeed;
                        this.InitializeList(ut.filename);
                    }
                }
For the case that downloads a picture, this is not much different:
           if (ut.opType == UserState.OperationType.download ||
                    ut.opType == UserState.OperationType.downloadList)
                {
                    if (e.ResponseStream != null)
                    {
                        WriteFile(ut.filename, e.ResponseStream);
                        this.FileInfo.Text = "Saved file: " + ut.filename;
                    }
                }
Where it get's a little more complicated is the "Backup an album" functionallity. An album can have a lot of pictures, and just doing something like this:
		foreach (Entry e in album.Entries)
			Service.QueryStreamAync(e.Uri, DateTime.MinValue, myObject);
                if (ut.opType == UserState.OperationType.downloadList)
                {
                    // we need to create a new object for uniqueness
                    UserState u = new UserState();
                    u.counter = ut.counter + 1;
                    u.feed = ut.feed;
                    u.foldername = ut.foldername;
                    u.opType = UserState.OperationType.downloadList;
                    
                    if (u.feed.Entries.Count > 0)
                    {
                        u.feed.Entries.RemoveAt(0);
                        this.PhotoList.Items.RemoveAt(0);
                    }
                    this.states.Add(u);
                    SaveAnotherPictureDelegate d = new SaveAnotherPictureDelegate(this.CreateAnotherSaveFile);
                    this.BeginInvoke(d, u);
                }
        private void CreateAnotherSaveFile(UserState us)
        {
            if (us.feed.Entries.Count > 0)
            {
                PicasaEntry p = us.feed.Entries[0] as PicasaEntry;
                us.filename = us.foldername + "\\image" + us.counter.ToString() + ".jpg";
                this.picasaService.QueryStreamAync(new Uri(p.Media.Content.Attributes["url"] as string), DateTime.MinValue, us);
            }
            else if (us.feed.Entries.Count == 0 && us.feed.NextChunk != null)
            {
            }
            else
            {
                this.Close();
            }
        }