3

我正在尝试使用 Async 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);
}
4

2 回答 2

7

相反,您可以使用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;
}

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

于 2012-03-16T11:32:07.230 回答
0

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

于 2012-03-16T11:23:35.953 回答