【问题标题】:Async HTTP Post data in single function using Async CTP使用异步 CTP 在单个函数中异步 HTTP 发布数据
【发布时间】:2012-03-16 20:41:04
【问题描述】:

我正在尝试使用异步 CTP 构建运行异步并返回值的单个函数。

这是我的示例代码。我不知道为什么它在返回时不填充“resp”变量。

public async Task<string> sendRequest(string url, string postdata)
{
    WebClient client = new WebClient();
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    Uri uri = new Uri(url);
    client.UploadDataAsync(uri,"POST", data);
    string resp = "";
    await TaskEx.Run(()=>
    client.UploadDataCompleted += (e, s) =>
    {
        resp = System.Text.Encoding.UTF8.GetString(s.Result);
    });
    return resp;
}

我也试过这个,但程序冻结(什么也不做,不仅仅是一会儿)。也许任何更正都会有所帮助。

public async Task<string> sendRequest(string url, string postdata)
{
    string resp = "";
    WebClient client = new WebClient();
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    Uri uri = new Uri(url);
    data = await TaskEx.Run(()=>client.UploadData(uri,"POST", data));

    return System.Text.Encoding.UTF8.GetString(data);
}

【问题讨论】:

  • 您在开始上传后订阅该活动。这意味着你有一个竞争条件。
  • 实际上是两场比赛 - @CodeInChaos 提到的一场,然后你的最后一个 await 正在等待,直到你订阅该活动 - 但不能保证该活动确实发生了。

标签: c# .net asynchronous async-ctp


【解决方案1】:

您可以改为使用 UploadDataTaskAsync 扩展方法(CTP 的一部分),而不必自己编写该管道代码:

public async Task<string> sendRequest(string url, string postdata)
{
    WebClient client = new WebClient();
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    Uri uri = new Uri(url);
    resp = System.Text.Encoding.UTF8.GetString(await client.UploadDataTaskAsync(uri,"POST", data));
    return resp;
}

该扩展方法的实现正确处理事件订阅,并确保在事件实际触发时完成任务。

【讨论】:

  • 你和我一样做这件事。我提到过,程序将在“等待”处冻结。
  • @ShirazITCo - 然后你 POSTing 这个数据的 url 没有响应 - 这与异步代码无关(但表明原始故障是第二个故障已识别 - 您的原始方法在 UploadDataCompleted 方法触发之前返回 - 它实际上从未触发)。
  • @ShirazITCo:您是否在某个时候阻止WaitResult?如果您将await client.UploadDataTaskAsync(..) 更改为await client.UploadDataTaskAsync(..).ConfigureAwait(false) 是否有效?
【解决方案2】:

您应该在开始上传之前订阅UploadDataCompleted。不确定这是否是您的问题的原因,但这是一个错误,可能导致 resp 未设置。

【讨论】:

  • @ShirazITCo 即使它不对您当前的问题负责,它仍然是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2011-08-05
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多