在asp.net中进行线程化

时间:2011-02-05 15:43:45

标签: asp.net multithreading

我正在尝试在我的数据库查询中实现超时...所以如果操作运行的时间太长,我需要取消查询并向asp.net页面返回超时消息....

继承了我用于超时部分的代码....问题是我有时会从查询中获得部分结果集...

RunSearch search = new RunSearch(GetSearchResults);
Thread searchThread = new Thread(delegate() {
dsRes =   search.Invoke(ProcessingID, 
objSqlConnection,SearchStartTime); });

searchThread.Start();
// searchThread.Join(ResultPollingPeriod * 1000);

if (!searchThread.Join(ResultPollingPeriod * 1000))
{
    searchThread.Abort();
    dsRes = null;
    return ReturnTimeoutMessage();
}
else
{
    return dsRes;
}

非常感谢任何帮助...

1 个答案:

答案 0 :(得分:1)

根据您的目标,有两种方法可以解决这个问题,但您不必编写自己的实现方法。您可以在数据库本身设置超时,这样您就不必在代码中处理此问题。如果您希望它是客户端定义的,虽然这里有两种类型的超时要考虑:连接超时和命令超时。

连接超时是指无法连接到服务器的时间。这是通过添加Connect Timeout=30在连接字符串设置中设置的。如果它在30秒内没有建立连接,它将超时。

如果确实建立了连接,则需要在SqlCommand对象上执行命令超时:

using (SqlCommand myCommand = new SqlCommand())
{
    myCommand.CommandTimeout = 30;
    //the rest of your command setup here
}

我的理解是CommandTimeout与连接超时同时运行 - 因此如果连接需要29秒,则必须执行并在1秒内返回。

这些超时会抛出异常,然后您可以根据需要捕获和执行(将超时消息返回到ASP.NET页面或其他某些内容)。