0

我目前正在使用 WPF 4.5 和 Visual Studio 11 开发人员预览版。我正在使用 async-await 东西在应用程序事件处理程序中异步执行 http requets。问题是第一次调用 await-able 方法会挂起应用程序线程,直到它完成。所有后续调用都可以,即在执行它们时应用程序仍然可用。

这是我的代码(仅有意义的摘录):

XAML

<toolkit:AutoCompleteBox FilterMode="None" 
                         Margin="5,0,5,0" 
                         x:Name="textArrival" 
                         Populating="textArrival_Populating"
                         SelectionChanged="textArrival_SelectionChanged"/>

C#代码隐藏:

private async void textArrival_Populating(object sender, PopulatingEventArgs e)
        {
            e.Cancel = true;
            textDeparture.ItemsSource = await model.ProcessStationRequest(textArrival.Text); 
            textArrival.PopulateComplete();
        }

来自前一段代码的可等待调用源:

public async Task<object[]> ProcessStationRequest(string request)
        {

        // omitted: preparing the request into MemoryStream outputStream
        // ...    

        HttpResponseMessage response = await httpClient.PostAsync(hostName, outputStream);

        // omitted: parsing the XML response to an object responseContainer 
        // and returning its member Items, which are of type object[] 
        //...

        return responseContainer.Items;

        }

当我在 ...await httpClient.PostAsync... 行之后调试和设置断点时,我发现在处理请求期间(大约 2 秒),确实是这个调用挂起了我的应用程序。但是,如果我将断点放在等待调用的行上,它会在自动完成文本框的填充开始后立即发生。至少在我的代码中,两者之间没有任何内容,这就是为什么我假设它对 httpClient 的等待调用会使我的应用程序挂起。

你能指出这段代码中导致这种奇怪行为的一些问题吗?

4

1 回答 1

0

您可能遇到了HttpWebRequest. 此对象上的“异步”方法实际上并不是(完全)异步的。:(

现在,我建议PostAsyncTask.Run.

我已将这个问题提交给 WCF( HttpClient) 团队,异步团队也在调查它。目前还没有真正的回应。

于 2011-10-25T15:50:10.753 回答