Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用异步CTP在单个函数中异步HTTP Post数据_C#_.net_Asynchronous_Async Ctp - Fatal编程技术网

C# 使用异步CTP在单个函数中异步HTTP Post数据

C# 使用异步CTP在单个函数中异步HTTP Post数据,c#,.net,asynchronous,async-ctp,C#,.net,Asynchronous,Async Ctp,我正在尝试使用AsyncCTP构建一个运行Async并返回值的函数 这是我的示例代码。我不知道为什么它在返回时不填充“resp”变量 public async Task<string> sendRequest(string url, string postdata) { WebClient client = new WebClient(); byte[] data = Encoding.UTF8.GetBytes(postdata); Uri uri = ne

我正在尝试使用AsyncCTP构建一个运行Async并返回值的函数

这是我的示例代码。我不知道为什么它在返回时不填充“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;
}
公共异步任务sendRequest(字符串url、字符串postdata)
{
WebClient客户端=新的WebClient();
byte[]data=Encoding.UTF8.GetBytes(postdata);
Uri=新的Uri(url);
UploadDataAsync(uri,“POST”,数据);
字符串resp=“”;
等待TaskEx.Run(()=>
client.UploadDataCompleted+=(e,s)=>
{
resp=System.Text.Encoding.UTF8.GetString(s.Result);
});
返回响应;
}
我也试过了,但是程序冻结了(暂时不做更多的事情)。也许任何修正都会有所帮助

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);
}
公共异步任务sendRequest(字符串url、字符串postdata)
{
字符串resp=“”;
WebClient客户端=新的WebClient();
byte[]data=Encoding.UTF8.GetBytes(postdata);
Uri=新的Uri(url);
data=wait TaskEx.Run(()=>client.UploadData(uri,“POST”,data));
返回System.Text.Encoding.UTF8.GetString(数据);
}

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

您可以使用
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;
}
公共异步任务sendRequest(字符串url、字符串postdata)
{
WebClient客户端=新的WebClient();
byte[]data=Encoding.UTF8.GetBytes(postdata);
Uri=新的Uri(url);
resp=System.Text.Encoding.UTF8.GetString(wait client.UploadDataTaskAsync(uri,“POST”,data));
返回响应;
}

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

启动上载后,您正在订阅事件。这意味着你有一个比赛条件。事实上,有两场比赛,@CodeInChaos提到的那场比赛,然后你最后一次的
wait
正在等待,直到你订阅了该活动-但不能保证该活动确实发生了。@ShirazITCo即使它对你眼前的问题不负责任,这仍然是一个错误。你做的和我一样。我提到过,程序将冻结在“wait”。@ShirazITCo-然后您发布此数据的url没有响应-这与异步代码无关(但表明原始错误是第二个确定的错误-您的原始方法在
UploadDataCompleted
方法触发之前返回-它实际上从未触发过)。@ShirazITCo:您是否在某个时候执行阻塞
等待
结果
?如果更改
等待客户端。UploadDataTaskAsync(…)
to
wait client.UploadDataTaskAsync(..).configureWait(false)
它能工作吗?