Invoking on the GUI Thread

As explained in the previous section, the notification is received by a background thread and not by the GUI thread on which the application is running. Although the refresh method cannot be run directly it can be invoked using a delegate.

  1. In the MainWindow.xaml.cs code file, define a delegate type for refreshing the display that takes no parameters called RefreshDelegate and declare a member of this type.

    public partial class MainWindow: Window
    {
        private JoobContext context;
        private Bank bank;
        delegate void RefreshDelegate();
        RefreshDelegate refreshDelegate;
  2. In the form constructor, point the refreshDelegate member to the refresh method.

    public MainWindow()
    {
        InitializeComponent();
        context = new JoobContext();
        bank = context.FirstInstance<Bank>();
        context.RegisterClassNotificationHandler(typeof(Customer), 
                                           NotificationEventConstants.SystemCreate, 
                                           customerCreatedNoteHandler);
        refreshDelegate = new RefreshDelegate(refresh);
  3. In the customerCreatedNoteHandler notification event handler method, use the Invoke method to marshal the refresh method to the GUI thread.

    private void customerCreatedNoteHandler(object sender, NotificationEventArgs e)
    {
        MessageBox.Show("Customer added");
        Dispatcher.Invoke(refreshDelegate);
    }
  4. Run the BankingApp application and then enter data for a new customer. Click the Add button to add the customer. After the message box is closed, the list of customers is refreshed automatically.