Método Async Não Finaliza

Boa tarde, Sou iniciante em C# e estou criando um Serviço Windows para envio mensagens de voz usando uma API de terceiros, durante o Debug, quando o serviço chega em um dos métodos POST Async que eu utilizo, o debug simplesmente não continua, ele vai ate determinado ponto dentro método e logo após o envio dos parâmetros da API para o servidor o Debug sai do método e volta ao método de origem. Não estou conseguindo resolver este problema, se alguém puder me ajudar ficarei muito grato, e caso não tenha ficado claro minha questão eu a reformularei. Obrigado.

Dá uma olhada no seguinte link:

https://msdn.microsoft.com/pt-br/library/JJ155813.aspx

Se não entender tento te explicar melhor…

Olá Eduardo,

O link foi muito explicativo entendi como funciona, porém não consegui aplicar de forma eficaz no meu código… quando eu entro no meu método async Task , durante o percurso do método assim que o debug lê um comando await ele simplesmente para ali, e fica esperando… eu não sei como prosseguir a partir da ai, acredito que estou fazendo algo de errado em relação a execução do método.

Cola o método para que possamos lhe ajudar.

static async void NovoTokenAsync(string login,string senha,string path,string pasta)
{
string ret = string.Empty;
try
{
var client = new HttpClient();

            var requestContent = new FormUrlEncodedContent(new[] {
                        new KeyValuePair<string, string>("client_id",login.Trim()),
                        new KeyValuePair<string, string>("client_secret",senha.Trim()),
                        new KeyValuePair<string, string>("format","XML"), // parametro de retorno. duas opções JSON ou XML, padrão JSON.
                    });

            HttpResponseMessage response = await client.PostAsync(
            "https://api.directcallsoft.com/request_token",
            requestContent);
            //await Task.Delay(60000);

            
            // Get the response content.
            HttpContent responseContent = response.Content;

            // Get the stream of the content.
            using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
            {
                // Write the output.
                // Console.WriteLine(await reader.ReadToEndAsync());
                ret = await reader.ReadToEndAsync();

                // Write the output.
                // Console.WriteLine(await reader.ReadToEndAsync());
                ret = await reader.ReadToEndAsync();
                XmlDocument xd = new XmlDocument();
                xd.LoadXml(ret);

                string nXML = "oi";//path + pasta + @"/" + "Envia" + login + ".xml";

                xd.Save(nXML);
            }
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("TTQAgente46", "[ENVIO MENSAGEM DE VOZ] - Erro durante solicitando e novo Token DirectCall - ERRO:" + ex.Message, EventLogEntryType.Error);               
        }
        
    }

Segue o método, assim que o método chega no primeiro comando await, ele retorna ao método principal, como se o compilador ignorasse o resto.

Testei seu código aqui e está funcionando, dá uma olhada se você tem conexão com a página solicitada. Coloca o var client = new HttpClient() dentro de um using(var client = new HttpClient()){}.

Dentro de C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files e C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files apaga os arquivos temporários, fecha o Visual Studio e abre novamente.

Olá cesarmendes,

Fiz o que você disse porém, a situação ainda ocorre… o compilador nao falha nem nada, somente sai do método… e como se estivesse esperando um comando para ativo… detalhe é que eu fiz um teste em um projeto Windows Forms e os métodos pegam normalmente, porém no meu projeto que é um Windows Services acontece este problema… será que tem algo a ver com isso ? É como se a tarefa ficasse em espera, esperando eu ativa-la de alguma maneira para ser concluída.

Tenta dessa forma abaixo, removi o tipo

static async void NovoTokenAsync(string login, string senha, string path, string pasta)
{
string ret = string.Empty;
try
{
var objeto = new {client_id = login, client_secret = senha};
var sb = new System.Text.StringBuilder();
var javascriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();

            javascriptSerializer.Serialize(objeto,sb);

            StringContent httpContent = new StringContent(sb.ToString() , System.Text.Encoding.UTF8);

            using (var client = new HttpClient())
            {
                HttpResponseMessage response = await client.PostAsync(
            "https://api.directcallsoft.com/request_token",
            httpContent);
                //await Task.Delay(60000);


                // Get the response content.
                HttpContent responseContent = response.Content;

                // Get the stream of the content.
                using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
                {
                    // Write the output.
                    // Console.WriteLine(await reader.ReadToEndAsync());
                    ret = await reader.ReadToEndAsync();

                    // Write the output.
                    // Console.WriteLine(await reader.ReadToEndAsync());
                    ret = await reader.ReadToEndAsync();
                    XmlDocument xd = new XmlDocument();
                    xd.LoadXml(ret);

                    string nXML = "oi";//path + pasta + @"/" + "Envia" + login + ".xml";

                    xd.Save(nXML);
                }
            
            }
        }
        catch (Exception ex)
        {
            //EventLog.WriteEntry("TTQAgente46", "[ENVIO MENSAGEM DE VOZ] - Erro durante solicitando e novo Token DirectCall - ERRO:" + ex.Message, EventLogEntryType.Error);
        }

    }