我正在尝试在我的数据库查询中实现超时...所以如果操作运行的时间太长,我需要取消查询并向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;
}
非常感谢任何帮助...
答案 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页面或其他某些内容)。