Task.Factory.StartNew有任何性能副作用吗?

时间:2015-04-11 13:15:24

标签: c# multithreading asynchronous asp.net-web-api2

我通过启动新线程来记录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。该问题与this one

有关

1 个答案:

答案 0 :(得分:2)

  

在一个真正的高流量应用中,这种方法是否有任何副作用?

这通常取决于您正在运行的环境,您的硬件是什么,以及“实际高流量”实际意味着什么。

通常,使用新线程进行简单记录可能会产生比“释放”当前线程以执行更多工作的实际增益更多的开销。是的,它将使用ASP.NET ThreadPool使用的相同线程,如果它被频繁调用,您可能会导致池中的饥饿,尽管这不太可能。

此外,使用Task.Factory.StartNewASP.NET is dangerous因为它没有注册使用IIS卸载到该线程的工作。

IMO,你应该保持简单并同步登录。