views:

25

answers:

1

As my user changes the CurrentItem of a dataForm, I need to go the server to get addtional data. It's quite likely that the user could scroll through several items before finding the desired one. I would like to sleep for 500ms before going to get the data.

Is there a component already in the SDK or toolkit like a background worker that would assist in getting back to the UI thread to make my WCF async call once the 500ms sleep is done? It seems that if I don't do that, and try instead to call the WCF async method on the sleeper thread then the Completed event fires on the sleeper thread and not the UI thread, which of course is not good.

+3  A: 

I think you might be a little off-track in your thinking. I'm not sure why you feel you need to get back to the UI thread in order to make the asych call. Generally you do as much work as you can on a BG thread and only marshal back to the UI thread when you have the results (by way of the Dispatcher).

I typically use a System.Threading.Timer for this purpose:

public class MyViewModel
{
    private readonly Timer refreshTimer;

    public MyViewModel()
    {
        this.refreshTimer = new Timer(this.DoRefresh);
    }

    public object CurrentItem
    {
        get { ... }
        set
        {
            ...
            Invalidate();
        }
    }

    // anything that should invalidate the data should wind up calling this, such as when the user selects a different item
    private void Invalidate()
    {
        // 1 second delay
        this.refreshTimer.Change(1000, Timeout.Infinite);
    }

    private void DoRefresh()
    {
        // make the async call here, with a callback of DoRefreshComplete
    }

    private void DoRefreshComplete()
    {
        // update the UI here by way of the Dispatcher
    }
}

HTH,
Kent

Kent Boogaart