【发布时间】: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