Task.Factory.StartNew 有任何性能副作用吗?
Does Task.Factory.StartNew has any performance side effects?
我在 ASP.NET Web API 2 应用程序中通过启动一个新线程来捕获和记录异常:
void MainMethod(){
try{
// stuff...
} catch (Exception ex) {
Logger.Log(ex);
}
}
class Logger {
void Log(Exception ex) {
Task.Factory.StartNew(() => LogAsync(ex));
}
void LogAsync(Exception ex) {
// doing some reflection stuff to retrieve code-place
// saving the log...
}
}
问题是:在真正的高流量应用中,这种做法有没有副作用?是不是登录主上下文比较好?
P.S。问题与 .
有关
in a real high traffic app, does this approach has any side effects?
这通常取决于您 运行 所在的环境、您的硬件以及 "real high traffic" 的实际含义。
一般来说,使用新线程来简单记录可能会产生比 "freeing up" 当前线程做更多工作的实际增益更多的开销。是的,它将使用 ASP.NET 线程池使用的相同线程,如果它被频繁调用,您可能会导致池饥饿,尽管这不太可能。
此外,使用 Task.Factory.StartNew
是 ASP.NET is dangerous,因为它不会使用 IIS 注册卸载到该线程的工作。
IMO,你应该保持简单并同步记录。
我在 ASP.NET Web API 2 应用程序中通过启动一个新线程来捕获和记录异常:
void MainMethod(){
try{
// stuff...
} catch (Exception ex) {
Logger.Log(ex);
}
}
class Logger {
void Log(Exception ex) {
Task.Factory.StartNew(() => LogAsync(ex));
}
void LogAsync(Exception ex) {
// doing some reflection stuff to retrieve code-place
// saving the log...
}
}
问题是:在真正的高流量应用中,这种做法有没有副作用?是不是登录主上下文比较好?
P.S。问题与
in a real high traffic app, does this approach has any side effects?
这通常取决于您 运行 所在的环境、您的硬件以及 "real high traffic" 的实际含义。
一般来说,使用新线程来简单记录可能会产生比 "freeing up" 当前线程做更多工作的实际增益更多的开销。是的,它将使用 ASP.NET 线程池使用的相同线程,如果它被频繁调用,您可能会导致池饥饿,尽管这不太可能。
此外,使用 Task.Factory.StartNew
是 ASP.NET is dangerous,因为它不会使用 IIS 注册卸载到该线程的工作。
IMO,你应该保持简单并同步记录。