2011-03-17 101 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