使用异步CTP在单个函数中异步HTTP发布数据
本文关键字:异步 布数据 数据 HTTP CTP 单个 函数 | 更新日期: 2023-09-27 18:27:56
我正在尝试使用异步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);
}
您可以使用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;
}
该扩展方法的实现正确地处理事件订阅,并确保在事件实际激发时完成任务。
您应该在开始上传之前订阅UploadDataCompleted
。不确定这是否是您的问题的原因,但这是一个可能导致resp
未设置的错误。