是新的Thread(()=> {// logic})。Start();在web应用程序page_load中“异步”执行逻辑是可以接受的

时间:2010-08-04 19:01:03

标签: c# asp.net multithreading

(我在主题中使用“异步”一词)

我一直在使用以下代码将初始会话上下文信息保存到数据库,例如会员详细信息以便以后跟踪。我建议其他人使用这个概念来加速他们的一些过程,但我不想暗示一些有潜在危险的东西。

我想知道这是否可以接受,或者是否会出现一些线程问题,我会在交通高峰时段引发这些问题?

            new Thread(() => {
                //All my logic for saving info to DB
            }) 
            { Name = "My long running page process", IsBackground = true, Priority = ThreadPriority.Normal }.Start();

更新

谢谢! 在David Basarab回答之后,我认为这将是我的新方法:

    Action someLongProcess = () =>
    {
        // You DB Work
    };

    someLongProcess.BeginInvoke((x) => {
        someLongProcess.EndInvoke(x);

        // It is now done you can do something
    }, null);

5 个答案:

答案 0 :(得分:2)

我会使用线程池。因为它使用预先提供的线程池,而不是为每个请求创建一个新线程。它通过公开回调为您提供真正的异步。

您可以使用Action委托并调用在后台使用线程池的BeginInvoke。

Action someLongProcess = () =>
    {
        // You DB Work
    };

AsyncCallback callback = (r) =>
    {
        // It is now done you can do something or pass null to do nothing
    };

someLongProcess.BeginInvoke(callback, null);

答案 1 :(得分:1)

不,它可能有效,但几乎无法接受。创建线程需要时间,因此这通常会使您的性能变差。

使用ThreadPool或(Fx 4+)任务库。

答案 2 :(得分:1)

ThreadPool将是更好的选择。但我建议阅读Make methods “fire and forget” with PostSharp,它提供了使用Thread.Start的替代方法。

答案 3 :(得分:1)

首选使用ThreadPool,因为它需要的资源更少。

 ThreadPool.SetMaxThreads(4);
 ThreadPool.QueueUserWorkItem(state => { Trace.WriteLine("Hello World."); });

.NET中新线程的开销实际上非常高,新线程的堆栈页面实际上是提交的,而且不仅是保留的,请参阅评论here和此blog post中的讨论。

答案 4 :(得分:1)

我推荐Task个对象,如果ThreadPool不可用,我推荐Task。但是,您需要注意的一件事是回收利用。在这种情况下,后台线程可能会意外终止。

如果您有需要的数据要保存到数据库,我建议使用AsyncOperation(或BackgroundWorker使用{{1}的异步页面在下面)。