以同步方式调用WebRequest.BeginGetResponse链

时间:2014-03-24 02:03:20

标签: .net asynchronous windows-phone-8 httpwebrequest

我正在编写一个可由桌面和WP8共享的可移植类库。在库中有一种从网站获取数据的方法,在这种方法中,必须以同步方式和按特定顺序进行一系列Web请求,每个响应的结果提供下一个请求,只有最终响应才对用户。

如果这是一个桌面.NET库,我会使用GetResponse()并在一个方法中拥有所有逻辑。我会在后台线程中调用这整个方法,以避免阻止UI交互。

在PCL / WP8中只有BeginGetResponse(),是否有一种设计模式或语法糖可以用来顺序编写同步调用链而不是一堆回调方法? / p>

1 个答案:

答案 0 :(得分:2)

HttpClient将是更好的选择。如果您因任何原因无法使用它,请将BeginGetResponse / BeginGetResponseTask.Factory.FromAsync一起打包,作为扩展方法:

static public Task<WebResponse> GetResponseAsTaskAsync(this WebRequest @this)
{
    return Task.Factory.FromAsync(
         (asyncCallback, state) =>
             @this.BeginGetResponse(asyncCallback, state),
         (asyncResult) =>
             @this.EndGetResponse(asyncResult), null);
}

然后你做这样的阻止调用:

var response = request.GetResponseAsTaskAsync().Result;

如果您一个接一个地执行一系列请求,则应保持此逻辑异步,并让PCL库的客户端决定是否阻止。像这样:

static public async Task<WebResponse> GetManyResponsesAsync(string[] urls)
{
    WebResponse lastResponse = null;
    foreach (url in urls)
    {
        var request = WebRequest.Create(url);
        var response = await request.GetResponseAsTaskAsync();
        // .. process response
        lastResponse = response;
    }
    return lastResponse;
}

来电者可以await选择GetManyResponsesAsync,或GetManyResponsesAsync().Result阻止。