嘿伙计们,我正在尝试使用线程在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();
}
有什么想法吗?
答案 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);
}
}