MVC-controller kann nicht ausgeführt Async-Methode

Ich habe eine sehr einfache MVC-controller mit one-Aktion:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        OpenConnection().Wait();

        return View();
    }

    private async Task OpenConnection()
    {
        var synchronizationContext = SynchronizationContext.Current;
        Debug.Assert(synchronizationContext != null);

        using (
            var connection =
                new SqlConnection(
                    @"Data Source=(localdb)\ProjectsV12;Initial Catalog=Database1;Integrated Security=True;"))
        {
            await connection.OpenAsync(); //this always hangs up                
        }
    }
}

Das problem ist, dass regelmäßige Aktion (nicht async-version) nicht erfüllen können async-Methoden. In meinem Fall OpenConnection () - Methode hängt immer oben an warten auf Verbindung.OpenAsync () - Linie.

Nach einiger Zeit fand ich zwei Wege, um diesen code zu arbeiten.

  1. Controller machen action-asynchrone

    public async Task<ActionResult> Index()
    {
        await OpenConnection();
    
        return View();
    }
  2. Oder erlauben die asynchrone Ausführung ohne Aufnahme original SychronizationContext für:

    await connection.OpenAsync();

    ersetzen mit:

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

So, meine Vermutung ist, dass meine anfängliche problem war irgendwo um SynchronizationContext. Aber SynchronizationContext.Strom ist nicht null, und das macht mich Frage mich, ob meine Vermutung richtig ist.

Also, kann jemand erklären, warum nicht async action im MVC-controller kann nicht syncronously ausführen von asynchronen Methoden?

InformationsquelleAutor davidoff | 2015-04-26
Schreibe einen Kommentar