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