2012-03-16 2 views
3

Я пытаюсь использовать Async CTP для создания единой функции, которая запускает async и возвращает значение.Async HTTP Post данные в одной функции с использованием Async CTP

вот мой пример кода. Я не знаю, почему он не заполняет переменную «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); 
} 
+0

Вы подписываетесь на мероприятие после загрузки. Это означает, что у вас есть состояние гонки. – CodesInChaos

+1

Две расы на самом деле - одна @CodeInChaos упоминает, а затем ваш последний 'ожидание' ждет, пока вы * не подписаны * на мероприятие, - но не гарантирует, что это событие действительно произошло. –

ответ

0

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

+0

не сработал .... – ShirazITCo

+0

@ShirazITCo Даже если он не несет ответственности за вашу непосредственную проблему, он по-прежнему является ошибкой. – CodesInChaos

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

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

+0

Вы сделали это параллельно мне. я упомянул, что программа замерзнет на «ожидание». – ShirazITCo

+0

@ShirazITCo - тогда URL-адрес, на который вы 'POST'уете эти данные, не отвечает - это не имеет никакого отношения к асинхронному коду (но будет указывать на то, что исходная ошибка была второй идентифицирована - ваш исходный метод возвращается перед запуском метода «UploadDataCompleted» - он никогда не срабатывает). –

+0

@ShirazITCo: Вы делаете блокировку 'Wait' или' Result' в какой-то момент? Если вы меняете 'await client.UploadDataTaskAsync (..)' to 'await client.UploadDataTaskAsync (..). ConfigureAwait (false)' это работает? –

Смежные вопросы