brianbruff
brianbruff

Reputation: 291

WCF Async operations not really async

wonder if anyone can tell me where i'm going wrong. i've added a service reference in my wpf application VS2012

however my wait on the Async call is blocking, i'm not doing anything with it at the moment. The Async call I got for free when I added the Service reference...

Yet when I await ma.searchModelsAsync I'm blocked...

can anyone shed some light on this??

first I call the function like this:

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    button1.IsEnabled = false;

    var cnt = await GetDataFromWcf();
    button1.IsEnabled = true;
}

here is the actual function I call

public async Task<List<ViewModels.ModelInfo>> GetDataFromWcf()
{
    using (var ma = new DataGenic.ModelActionsServiceTypeClient())
    {
        var modelInfos = await ma.searchModelsAsync(new ModelSearchCriteria { Category = "ECB" }, 1, 50);
        return modelInfos.Select(mi => new ViewModels.ModelInfo { Id = mi.Id, Name = mi.Name, Uri = mi.Uri }).ToList();
    }
}

btw: if I put the function in a Task.Run(() => ... then it behaves as I expcect...

Not sure if WCF is really giving me what I want.. ideas anyone?

Upvotes: 2

Views: 454

Answers (1)

James Manning
James Manning

Reputation: 13589

Based on the comment thread thus far, it sounds like there's enough work happening before the WCF task starts up such that you'd like to have GetDataFromWcf return to the caller sooner than that. That's a somewhat common issue with async methods (IMHO) - the 'gotcha' that they run synchronously up until that first 'await' call, so they can still cause noticeable UI delays if too much is happening before the first 'await' :)

Because of that, a simple change would be to use Task.Yield (by adding await Task.Yield(); as the first line in GetDataFromWcf) which changes the behavior to have the async method return back to the caller immediately. As the MSDN doc mentions, you can use await Task.Yield(); in an asynchronous method to force the method to complete asynchronously. That sentence alone (and how silly it sounds on the surface) helps show the 'gotcha' IMHO :)

Upvotes: 3

Related Questions