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.
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 –