在asp.net崩溃服务器中线程化

时间:2011-03-17 00:59:45

标签: c# asp.net vb.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 个答案:

答案 0 :(得分:3)

当线程再次点击它时,已经(很可能)发送了HTTP Response。线程与ASP.NET页面生命周期不兼容。考虑改变你的过程。

请参阅此页面了解挑战。

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

答案 1 :(得分: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.
}

答案 2 :(得分: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);
    }
}