2011-03-17 98 views
0

嘿家伙,我试图让线程工作在ASP.NET中,但由于某种原因,它不断崩溃我的本地服务器,并根本不工作时,在网上上传。这里的代码:线程在asp.net崩溃的服务器

protected void testThread() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Response.Write("Threading! <br/><br/>"); 
     Thread.Sleep(500); 
    } 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 

    Thread oThread = new Thread(testThread); 
    oThread.Priority = ThreadPriority.Lowest; //Tried with and without this 

    // Start the thread 
    oThread.Start(); 
} 

任何想法?

+3

它是如何崩溃的?有错误吗?检查EventLog并查看是否有任何内容。 – 2011-03-17 01:02:09

回答

1

像什么@Daniel说,Response可能已经被时间的线程运行终止。解决方案是在线程运行时保持连接处于活动状态。我们可以通过分配和异步任务来完成这项工作。

protected void Page_Load(object sender, EventArgs e) 
{ 
    AddOnPreRenderCompleteAsync(new BeginEventHandler(Thread_BeginEvent), new EndEventHandler(Thread_EndEvent)); 
} 
protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    Response.Write(result); 
} 

private string result; 

IAsyncResult Thread_BeginEvent(object sender, EventArgs e, AsyncCallback cb, object extraData) 
{ 
    WaitCallback w = new WaitCallback(Thread_DoWork); 
    return w.BeginInvoke(sender, cb, extraData, w); 
} 
void Thread_EndEvent(IAsyncResult ar) 
{ 
    WaitCallback w = ar.AsyncState as WaitCallback; 
    if(w != null) 
     w.EndInvoke(ar); 
} 

void Thread_DoWork(object state) 
{ 
    result = ""; 
    for (int i = 0; i < 10; i++) 
    { 
     result += "Threading! <br/><br/>"; 
     Thread.Sleep(500); 
    } 
} 

你可能想试试这个为好,但我不知道它是否有效与否,但我怀疑这会:

void Thread_DoWork(object state) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Response.Write("Threading! <br/><br/>"); 
     Thread.Sleep(500); 
    } 
} 
3

HTTP Response已经(非常有可能)在线程再次击中它时发送。线程在ASP.NET页面生命周期中效果不佳。考虑改变你的过程。

看到这个页面的挑战。

http://www.beansoftware.com/ASP.NET-Tutorials/Multithreading-Thread-Pool.aspx

+0

有没有办法将内容写入没有响应对象的页面? – Rob 2011-03-17 01:36:43

+0

还应考虑使用许多库提供的异步页面(Page指令的异步属性)和Begin___和End___方法,尤其是在您的站点可能拥有更高流量时。 – joelt 2011-03-17 01:36:46

+0

AJAX如何?我没有看太多,但它适合这种类型的东西吗? – Rob 2011-03-17 01:45:12

2
protected void Button1_Click(object sender, EventArgs e) 
{ 

    Thread oThread = new Thread(testThread); 
    oThread.Priority = ThreadPriority.Lowest; //Tried with and without this 

    // Start the thread 
    oThread.Start(); 

    oThread.Join() 
    // defeats the purpose of multithreading, but you can't 
    // let the main thread return if the newly spawned thread 
    // it trying to use Response object. 
} 
+0

这似乎是有道理的。那么有什么方法可以在没有响应对象的情况下将内容写入页面? – Rob 2011-03-17 01:31:59