Асинхронный метод CTP зависает при возвращении значения - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь создать асинхронный метод, который возвращает значение.все работает при использовании метода без возврата.Вы можете обрабатывать данные, но проблема появляется, когда добавлено предложение return.программа зависает полностью без каких-либо ошибок или на некоторое время.

см. Код:

public void runTheAsync(){
   string resp = sendRequest("http://google.com","x=y").Result;
}

public async Task<string> sendRequest(string url, string postdata)
{
    //There is no problem if you use void as the return value , the problem appears when Task<string> used. the program fully go to freeze.
    Console.WriteLine("On the UI thread.");

    string result = await TaskEx.Run(() =>
    {
        Console.WriteLine("Starting CPU-intensive work on background thread...");
        string work = webRequest(url,postdata);
        return work;
    });

    return result;
}

public string webRequest(string url, string postdata)
{
    string _return = "";
    WebClient client = new WebClient();
    byte[] data = Encoding.UTF8.GetBytes(postdata);
    Uri uri = new Uri(url);
    _return = System.Text.Encoding.UTF8.GetString(client.UploadData(uri, "POST", data));
    return _return;
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2012
string resp = sendRequest("http://google.com","x=y").Result;

Это твоя проблема. Если вы наберете Result на Task, он блокируется, пока не закончится Task.

Вместо этого вы можете сделать это:

public async void runTheAsync()
{
   string resp = await sendRequest("http://google.com","x=y");
}

Но создания async void методов следует избегать. Можете ли вы избежать этого, зависит от того, как вы это называете.

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

Попробуйте, проверки правильности данных и т. Д. Пропущены, но вы их также проигнорировали: -):

public async Task<string> UploadRequestAsync(string url, string postdata) 
{  
    string result = await Encoding.GetString(
        new WebClient().UploadData(new Uri(uri), "POST", Encoding.UTF8.GetBytes(postdata)));
    return result; 
} 

Вы как-то выполняете работу дважды, await выполняя явно запущенную задачу.Мне было бы любопытно посмотреть, как выглядит сгенерированный код для этого ... И, конечно, в производственном коде используются подходящие классы из .NET 4.5.

...