Ich wickle AspNet.Identity. Aber etwas verwirrt mich über TPL.Was ist der Hauptunterschied zwischen dem Zurückgeben einer Aufgabe durch das await-Schlüsselwort und dem Zurückgeben ohne awaise-Schlüsselwort?
Erstes Beispiel:
public virtual async Task<IdentityResult> RemovePasswordAsync(string userId)
{
var user = _store.FindByIdAsync(userId).Result;
if (user == null)
throw new InstanceNotFoundException("user");
user.PasswordHash = String.Empty;
user.SecurityStamp = String.Empty;
return await UpdateAsync(user);
}
public virtual async Task<IdentityResult> UpdateAsync(TUser user)
{
await _store.UpdateAsync(user);
return new IdentityResult();
}
Zweites Beispiel:
public virtual Task<IdentityResult> RemovePasswordAsync(string userId)
{
var user = _store.FindByIdAsync(userId).Result;
if (user == null)
throw new InstanceNotFoundException("user");
user.PasswordHash = String.Empty;
user.SecurityStamp = String.Empty;
return UpdateAsync(user);
}
public virtual async Task<IdentityResult> UpdateAsync(TUser user)
{
await _store.UpdateAsync(user);
return new IdentityResult();
}
Und Client nennen dies wie:
result = await _userManager.RemovePasswordAsync(user.Id);
Meine erste Frage ist:
Wenn der Client ruft die zweite an Methode wird die Arbeit aus dem IO-Thread in einen Threadpool-Thread ausgelagert. Und wenn RemovePasswordAsync aufgerufen wird, ruft es UpdateAsync auf, das ein Warte-Schlüsselwort hat. An diesem Punkt wird dieser Threadpool-Thread in einen anderen Threadpool-Thread ausgelagert. Oder verwendet TPL stattdessen den gleichen Thread?
Und meine zweite Frage ist; Was ist der Hauptunterschied zwischen der ersten Implementierung und der zweiten Implementierung der Konstruktion dieser asynchronen Methode?
EDIT:
Dies ist die Update-Methode der Klasse Users. (_store.UpdateAsync (Benutzer))
public Task UpdateAsync(TUser user)
{
if (user == null)
throw new ArgumentNullException("user");
return _userService.UpdateAsync(user);
}
Und das ist die Update-Methode der Klasse Userservice
public Task UpdateAsync(TUser user)
{
return Task.Factory.StartNew(() => Update(user));
}
Die zweite Frage: http://StackOverflow.com/Q/21033150/1768303 – Noseratio
Sie sollten StartNew (in Web-Anwendungen) eigentlich nicht verwenden - Der Grund dafür ist, dass wenn Sie warten, der ausführende Thread zurück an gesendet wird der CLR-Threadpool, wenn Sie neu beginnen, ziehen Sie einen Thread aus dem CLR-Threadpool. Dies ist in Webanwendungen kontraproduktiv. (Sie erhalten Thread-Verhungern, IIS kann einem Thread keine neuen Anforderungen zuweisen, sodass Ihre HTTP.Sys-Eingangswarteschlange (http-Stapel) voll wird und Ihre Benutzer nicht mehr zugelassen werden) –
@Steve Thread-Verhungern? Wie? Sie befreien den Anfrage-Thread (so dass asp.net ihn verwenden kann, um andere eingehende Anfragen zu servern) und entlädt sich in einen Threadpool-Thread. – dcastro