如何在方法C#上设置超时

时间:2015-03-09 17:07:40

标签: c# .net database multithreading netezza

大家好,我刚才有一个问题。无论出于何种原因,一段代码定期不返回,我还不是100%肯定。为了解决这个问题,我想知道,使用下面的Close()方法,有没有办法对它进行超时?那么,如果它在1分钟左右没有完成,它会继续前进吗?

任何建议都将不胜感激。谢谢,

如果它有任何区别,写这篇文章的原作者注意到他认为它挂在了关闭()并注意到“也许太快了?” (该连接是与Netezza的oledb连接,整个应用程序是多线程的)。

无论如何,就目前而言,我只是希望能够让应用程序至少完成,而不是挂在异常捕获上。

下面是Close();我认为不会回来。

catch(Exception){
    Close(); //-- if we have an error, close everything down and then return the error
    throw;}


public void Close() {
        if (null != Command) {
            Command.Cancel();
            Command.Dispose();
            Command = null;
        }

        if (null != Connection) {
            if (Connection.State != System.Data.ConnectionState.Closed)
                Connection.Close();
            Connection.Dispose();
            Connection = null;
        }

    }

2 个答案:

答案 0 :(得分:0)

而不是在方法上超时,你真的是指命令超时吗?

基于Close(),您将共享命令和连接 对于大量多线程的应用程序来说,这不是一个好的设计 即使是轻微的多线程应用程序,这也不是一个好的设计。

DbCommand具有超时属性

使用语句将执行清理(包括关闭)

string connectionString = "";
// Wait for 5 second delay in the command
string queryString = "waitfor delay '00:00:05'";
using (OleDbConnection connection = new OleDbConnection(connectionString )) {
    connection.Open();
    SqlCommand command = new connection.CreateCommand();
    // Setting command timeout to 1 second
    command.CommandText = queryString;
    command.CommandTimeout = 1;
    try {
        command.ExecuteNonQuery();
    }
    catch (DbException e) {
        Console.WriteLine("Got expected DbException due to command timeout ");
        Console.WriteLine(e);
    }
}

答案 1 :(得分:0)

假设您使用的是.NET 4.0及更高版本,则可以使用TPL使用System.Threading.Tasks.Task对象执行此操作。您创建一个任务以异步方式运行方法,然后等待该任务的超时时间,如果它到期 - 让主线程继续。

Task timeoutTask = new Task(Close); // create a Task around the Close method.
timeoutTask.Start(); // run asynchronously.
bool completedSuccessfully = timeoutTask.Wait(TimeSpan.FromMinutes(1));
if (completedSuccessfully)
{
    // Yay!
}
else
{
   logger.Write("Close command did not return in time. Continuing");
}

在此示例中,Close方法将继续在后台运行,但您的主线程可以继续。