代码之家  ›  专栏  ›  技术社区  ›  Brian

是新线程(()=>{//logic}).Start();可接受在web应用程序页面加载中“异步”执行逻辑

  •  3
  • Brian  · 技术社区  · 16 年前

    (我在主题中松散地使用了“异步”一词)

    我想知道这是可以接受的,还是有一些线程问题,我会导致以后在交通高峰期的道路?

                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 回复  |  直到 16 年前
        1
  •  2
  •   David Basarab    16 年前

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

    您只需使用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);
    
        2
  •  1
  •   Henk Holterman    16 年前

    不,这可能管用,但几乎不能接受。创建线程需要时间,因此这通常会使性能更差。

    使用线程池或(Fx 4+)任务库。

        3
  •  1
  •   Mikael Svenson    16 年前

    Make methods “fire and forget” with PostSharp ,它提供了使用Thread.Start的替代方法。

        4
  •  1
  •   Stephen Cleary    16 年前

    我推荐一个 Task 对象,或 ThreadPool 如果 任务

    如果你有数据 需要 为了保存到数据库,我建议使用异步页面和 AsyncOperation (或 BackgroundWorker ,使用

        5
  •  1
  •   Community Mohan Dere    9 年前

    ThreadPool 应优先考虑,因为它需要较少的资源。

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

    NET中新线程的开销实际上相当高,新线程的堆栈页实际上是提交的,而不仅仅是保留的,请参见注释中的讨论 here 还有这个 blog post .