2016-06-06 9 views
3

Ich muss ein SSIS-Paket aus dem Code asynchron ausführen, damit es den UI-Thread nicht blockiert. Zur Zeit verwende ich einen einfachen Thread, um dies zu umgehen, ohne den UI-Thread zu blockieren. Nach dem Lesen einiger Blogposts wollte ich jedoch die async/await-Funktionalität testen, da das Erstellen eines neuen Threads im Vergleich zu async/await ressourcenintensiv ist.UI-Thread wird blockiert, wenn async/await mit Task in der ASP.NET-Webanwendung verwendet wird

Der Code, den ich geschrieben habe, ist dies.

 protected void Page_Load(object sender, EventArgs e) 
     { 
      RegisterAsyncTask(new PageAsyncTask(SSISAsync)); 
     } 

     public async void Button1_Click(object sender, EventArgs e) 
     { 
      Debug.WriteLine("Before calling task"); 
      await SSISAsync(); 
      Debug.WriteLine("After calling task"); 
     } 


     public Task<int> SSISAsync() 
     { 
      //Sample task to keep the task doing some work. 
      return Task.Run(() => 
      { 
       for (int i = 0; i < 100000; i++) 
       { 
        for (int j = 0; j < 10000; j++) 
        { 
         int k = i * j; 
         //Nothing LOL 
        } 
       } 
       Debug.WriteLine("from thread"); 
       return 1; 
      }); 
     } 

Was ich geschehen erwarten ist, dass, wenn die Button1_Click Methode synchron nach oben ausgeführt wird, bis er einen await Schlüsselwort trifft und dann rufen sie die SSISAsync auf einem separaten Thread aus dem Thread-Pool und nicht auf dem UI-Thread. Im Idealfall blockiert dies also nicht den UI-Thread, wenn der Task ausgeführt wird. Aber meine UI blockiert, d. H.) Das Laden gif auf der Registerkarte in IE geht weiter, bis die Aufgabe abgeschlossen ist.

Ich habe ein paar ähnliche Fragen in SO gesehen. Aber die meisten von ihnen waren mit WPF verwandt und keine der Lösungen hat wirklich funktioniert.

+4

Es gibt keine Vorstellung von ** UI-Thread ** in asp.net auf der Serverseite, UI wird auf der Clientseite vom Webbrowser gerendert. Sie möglicherweise missverstehen dann, wie async/erwarten Sie in asp.net unterscheidet sich von wpf. Wenn dies der Fall ist, lesen Sie diesen msdn-Eintrag von Stephen Cleary https://msdn.microsoft.com/en-us/magazine/dn802603.aspx –

Antwort

3

Es gibt einige Missverständnisse hier.

Also, idealerweise blockiert dies nicht den UI-Thread, wenn der Task ausgeführt wird.

Erstens gibt es auf ASP.NET kein UI-Thread.

Aber meine UI blockiert, d. H.) Das Laden gif auf der Registerkarte in IE geht weiter, bis die Aufgabe abgeschlossen ist.

Was Sie wirklich suchen, ist eine Möglichkeit, von einer ASP.NET-Anfrage vorzeitig zurückzukehren. Wie ich in meinem Blog beschreibe, async has nothing to do with returning early.

In der Tat, da Sie es in einen Browser laden, denke ich, dass die Rückkehr früh überhaupt nicht funktioniert. Was Sie wirklich tun möchten, ist eine Seite zurück, die dann AJAX verwendet, um zu laden, was auch immer es benötigt. AJAX ist natürlich asynchron (auf der Client-Seite), so dass diese Vorgehensweise es Ihnen ermöglichen sollte, schnell eine "loading ..." Seite zu laden und dann die UI (Browser) beim Laden des Rests responsiv zu halten.