Async HTTP Post данных в одной функции с использованием Async CTP - PullRequest
3 голосов
/ 16 марта 2012

Я пытаюсь использовать Async CTP для создания одной функции, которая запускает 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;
}

Также я попробовал это, но программа зависла (больше ничего не делайте, только на некоторое время).может быть, любая коррекция может помочь.

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);
}

Ответы [ 2 ]

7 голосов
/ 16 марта 2012

Вместо этого вы можете использовать метод расширения 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;
}

Реализация этого метода расширения обрабатывает событиеправильно подписаться и гарантирует, что задача будет выполнена, когда событие действительно сработает.

0 голосов
/ 16 марта 2012

Вы должны подписаться на UploadDataCompleted перед началом загрузки.Не уверен, отвечает ли это за вашу проблему, но это ошибка, которая может привести к тому, что resp не будет установлен.

...