public Task Show()
        {
            var currentPage = ((App)Application.Current).RootFrame.Content as PhoneApplicationPage;
            var layoutroot  = currentPage.Content as Grid;

            layoutroot.Children.Add(this);

            AsyncResult = new FSAsyncResult();
            if (string.IsNullOrWhiteSpace(Place.Id))
            {
                ActionText.Text = Localized.PlaceEditorAdd;
            }
            else
            {
                ActionText.Text = Localized.PlaceEditorEdit;
            }

            EnableMenu(false);

            return(Task.Run(() =>
            {
                AsyncResult.AsyncWaitHandle.WaitOne();
                AsyncResult.Dispose();

                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    layoutroot.Children.Remove(this);
                    EnableMenu(true);
                });
            }
                            ));
        }
Example #2
0
        public Task <ContactData> GetContactData(string email)
        {
            FSAsyncResult task;

            var started = DateTimeOffset.UtcNow;

            //FSLog.Debug("start:", email);

            lock (Tasks)
            {
                lock (Contacts)
                {
                    if (Contacts.ContainsKey(email))
                    {
                        return(Task <ContactData> .Run(() => {
                            FSLog.Debug("end:", email, DateTimeOffset.Now - started);
                            return Contacts[email];
                        }));
                    }
                }

                // See if search started for this email
                if (Tasks.ContainsKey(email))
                {
                    task = Tasks[email];
                }
                else // Not running already
                {
                    task         = new FSAsyncResult();
                    Tasks[email] = task;

                    //Start the asynchronous search.
                    Contacts cons = new Contacts();

                    //Identify the method that runs after the asynchronous search completes.
                    cons.SearchCompleted += (object sender, ContactsSearchEventArgs e) =>
                    {
                        FSLog.Info("SearchCompleted:", email);

                        ContactData data = new ContactData();
                        data.DisplayName = email;

                        // Grab first match
                        foreach (Contact con in e.Results)
                        {
                            data.IsFound = true;

                            //No results
                            if (!string.IsNullOrWhiteSpace(con.DisplayName))
                            {
                                data.DisplayName = con.DisplayName;
                            }

                            System.IO.Stream stream = con.GetPicture();
                            if (stream != null)
                            {
                                BitmapImage img = new BitmapImage();
                                img.SetSource(stream);
                                data.Photo = img;
                                break;
                            }
                        }

                        lock (Contacts)
                        {
                            Contacts[email] = data;
                        }

                        task.IsCompleted = true;
                    };

                    cons.SearchAsync(email, FilterKind.EmailAddress, task);
                }
            }

            return(Task <ContactData> .Run(() =>
            {
                //FSLog.Debug("wait:", email);
                task.Wait();

                lock (Tasks)
                {
                    Tasks.Remove(email);
                    task.Dispose();
                }

                lock (Contacts)
                {
                    //FSLog.Debug("end:", email, DateTimeOffset.Now - started);
                    return Contacts[email];
                }
            }));
        }