2017-09-05 1 views
0

Ich habe eine Reihe von asynchronen Funktionen, die kaskadiert sind, aber wenn es die letzte ausführt, gibt es die Werte nicht zu den vorherigen zurück.C# Async-Methode kehrt nicht zum Aufrufer wie erwartet zurück

Hier wird mein erster Anruf ausgeführt. Dies ist eine WebAPI-Funktion und geht immer zu Ende.

[HttpGet] 
    [Route("integracao/iniciar")] 
    public IHttpActionResult FazerIntegrar() 
    { 
     try 
     { 
      Integrar objIntegrar = new Integrar(); 

      return Ok(objIntegrar.Integra()); 
     } 
     catch (Exception ex) 
     { 
      return InternalServerError(ex); 
     } 

    } 

so ist meine Funktion in meiner Bibliothek heißt. Innerhalb meiner Funktion habe ich eine für die Ausführung nur einmal. Der Fluss wird nie von ihm wieder die Schleife

public async Task<bool> Integra() 
    { 
     var files = Directory.GetFiles(@"C:\inetpub\wwwroot\Atendup\Arquivos\Backup\"); 

     bool retorno = false; 

     if (files != null) 
     { 
      foreach (var item in files) 
      { 
       retorno = false; 

       using (StreamReader sr = new StreamReader(item)) 
       { 
        if (sr != null) 
        { 
         while (sr.EndOfStream == false) 
         { 
          string line = await sr.ReadLineAsync(); 

          string[] grupo = line.Split(new[] { "#*#" }, StringSplitOptions.None); 

          procData objProc = new procData(); 

          objProc.proc = grupo[0]; 

          objProc.name = JsonConvert.DeserializeObject<List<string>>(grupo[1]); 
          objProc.valor = JsonConvert.DeserializeObject<List<object>>(grupo[2]); 
          objProc.tipo = JsonConvert.DeserializeObject<List<Type>>(grupo[3]); 

          _context = new IntegrarRepository("online_pedidopizza"); 

          retorno = await _context.IntegrarAsync(objProc); 

          //retorno = await _context.IntegrarAsync(objProc); 
         } 
        } 
       } 

       if (retorno == true) 
       { 
        await DeleteAsync(item); 
       } 
      } 
     } 

     return retorno; 
    } 

Ich habe eine dritte Funktion, nur um weiterhin mit dem Repository

 public async Task<bool> IntegrarAsync(procData objProc) 
    { 
     return await this.SendIntegrarAsync(objProc); 
    } 

Und schließlich der Kommunikation mit der Datenbank zu vermitteln, wird die gesamte Code korrekt ausgeführt. Debuggen Sie bis zum Ende dieser vierten Funktion erhalten kann, aber dann die Debug-Stop und nicht an den Anfang geht zurück

protected async Task<bool> SendIntegrarAsync(procData parametro) 
    { 
     bool retorno = false; 

     using (SqlConnection conn = new SqlConnection("")) 
     { 
      using (SqlCommand cmd = new SqlCommand(parametro.proc, conn)) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 

       if (parametro != null) 
       { 
        for (int i = 0; i < parametro.name.Count; i++) 
        { 
         AdicionaParametro(cmd, parametro.name[i], parametro.valor[i], parametro.tipo[i]); 
        } 
       } 

       try 
       { 
        cmd.CommandTimeout = 300; 

        await conn.OpenAsync().ConfigureAwait(false); 

        var resultado = await cmd.ExecuteScalarAsync().ConfigureAwait(false); 

        if (resultado != null) 
        { 
         retorno = Convert.ToBoolean(resultado); 
        } 
       } 
       catch (Exception ex) 
       { 
        Logs objLog = new Logs() 
        { 
         metodo = MethodBase.GetCurrentMethod().Name, 
         classe = this.GetType().Name, 
         dados = parametro, 
         data = DateTime.Now, 
         mensagem = ex.Message, 
         exception = ex.InnerException == null ? "" : ex.InnerException.ToString() 
        }; 

        objLog.Adiciona(); 

        string name = DateTime.Now.ToBinary().ToString(); 

        using (StreamWriter sw = new StreamWriter(@"C:\inetpub\wwwroot\Atendup\Arquivos\Backup\" + name + ".txt")) 
        { 
         string line = ""; 

         line += parametro.proc + "#*#"; 
         line += JsonConvert.SerializeObject(parametro.name) + "#*#"; 
         line += JsonConvert.SerializeObject(parametro.valor) + "#*#"; 
         line += JsonConvert.SerializeObject(parametro.tipo) + "#*#"; 

         sw.WriteLine(line); 
        } 
       } 
      } 
     } 

     return retorno; 
    } 

Was soll ich tun? Dank

+1

können Sie versuchen, Ihre Methode Signatur zu ändern, um 'async Aufgabe ' und 'setzen zurückkehren OK (erwarten objIntegrar.Integra()); in Ihrem Versuch/fangen? – MarcinJuraszek

Antwort

2

Ihre Web-API-Aufruf nicht async wird versuchen, zu ändern, es zu:

[HttpGet] 
[Route("integracao/iniciar")] 
public async Task<IHttpActionResult> FazerIntegrar() 
{ 
    try 
    { 
     Integrar objIntegrar = new Integrar(); 

     return Ok(await objIntegrar.Integra()); 
    } 
    catch (Exception ex) 
    { 
     return InternalServerError(ex); 
    } 

} 
Verwandte Themen