在我的网站中,我使用一个线程在后台执行一个过程。我点击按钮启动线程。
现在我遇到的问题是它似乎超时并停止了。基本上它会停止更新数据库。
可能出现什么问题?
这是我的代码:
public static class BackgroundHelper
{
private static readonly object _syncRoot = new object();
private static readonly ManualResetEvent _event = new ManualResetEvent(false);
private static Thread _thread;
public static bool Running
{
get;
private set;
}
public static void Start()
{
lock (_syncRoot)
{
if (Running)
return;
Running = true;
// Reset the event so we can use it to stop the thread.
_event.Reset();
// Star the background thread.
_thread = new Thread(new ThreadStart(BackgroundProcess));
_thread.Start();
}
}
public static void Stop()
{
lock (_syncRoot)
{
if (!Running)
return;
Running = false;
// Signal the thread to stop.
_event.Set();
// Wait for the thread to have stopped.
_thread.Join();
_thread = null;
}
}
private static void BackgroundProcess()
{
int count = 0;
DateTime date1 = new DateTime(2011, 2, 5);
while (System.DateTime.Compare(System.DateTime.Now, date1) < 0)
{
downloadAndParse();
// Wait for the event to be set with a maximum of the timeout. The
// timeout is used to pace the calls to downloadAndParse so that
// it not goes to 100% when there is nothing to download and parse.
bool result = _event.WaitOne(TimeSpan.FromSeconds(45));
// If the event was set, we're done processing.
// if (result)
// break;
count++;
}
}
private static void downloadAndParse()
{
NewHive.MyServ newServe = new NewHive.MyServ();
NewHive.CsvDownload newService = new NewHive.CsvDownload();
//NewHive.MyServ newServe = new NewHive.MyServ();
string downloadSuccess = newService.CsvDownloader();
if (downloadSuccess == "Success")
{
string parseSuccess = newService.CsvParser();
}
newServe.updateOthersInPosition();
}
}
答案 0 :(得分:2)
后台线程只有在调用它的线程处于活动状态时才能生存。由于Web服务器具有有限的请求/响应生命周期,因此您的后台进程不能超过此时间限制。一旦在Web服务器上达到超时,服务器将生成响应(超时),将其推送到客户端并停止线程。这个事件会杀死你的后台线程,所以如果它在数据库的中期更新它就会停止。如果您正在执行写入文件之类的操作,则会使该文件保持打开状态,锁定状态并且编写不正确(需要重新启动才能重新访问已损坏的文件)。