C# 任务内部的异常处理。运行

C# 任务内部的异常处理。运行,c#,.net,multithreading,exception-handling,task,C#,.net,Multithreading,Exception Handling,Task,问题是当命令.ExecuteReader()由于数据库中的行已被其他进程锁定而不得不等待很长时间(几分钟)时,整个线程就会死机。如果它必须等待更少的时间,例如一分钟,它就会工作。如果它死了,代码永远不会到达catch块 我不想将异常处理移出任务。连续工作应该是一个独立的过程。对于异常,它应该记录异常详细信息并继续处理数据库中的下一行。如果发生任何其他异常,catch块工作正常 这可能是数据库命令超时问题吗 问题是为什么它没有到达捕捉区 为什么使用而(true)?这是一个无限循环,这个任务意味着要

问题是当
命令.ExecuteReader()
由于数据库中的行已被其他进程锁定而不得不等待很长时间(几分钟)时,整个线程就会死机。如果它必须等待更少的时间,例如一分钟,它就会工作。如果它死了,代码永远不会到达catch块

我不想将异常处理移出任务。连续工作应该是一个独立的过程。对于异常,它应该记录异常详细信息并继续处理数据库中的下一行。如果发生任何其他异常,catch块工作正常

  • 这可能是数据库命令超时问题吗
  • 问题是为什么它没有到达捕捉区

  • 为什么使用
    而(true)
    ?这是一个无限循环,这个任务意味着要持续运行。这个例子很简单,在实际代码中,我也有cancellationToken来停止这个过程。你知道你的应用程序失败的确切位置吗?是否是
    connection.Open()
    ?调试时,代码在命令.ExecuteReader()处停止。这是可以的,因为行被锁定,并且我在查询中没有说NOWAIT。但是如果必须等待几分钟,执行将不会继续。可能是为您
    using System;
    using Oracle.ManagedDataAccess.Client;
    namespace TestApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                Task.Run(() => Activity.Run());
            }
        }
    
        public static class Activity
        {
            public static void Run()
            {
                const string sql = "SELECT * FROM MYTABLE WHERE ID = 103368 FOR UPDATE";
    
                while (true)
                {
                    try
                    {
                        using (var connection = new OracleConnection())
                        {
                            connection.ConnectionString = "xxx";
                            using (var command = connection.CreateCommand())
                            {
                                command.CommandText = sql;
                                connection.Open();
    
                                var reader = command.ExecuteReader();
                                if (reader.Read())
                                {
                                    var x = reader[0];
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        //ERROR LOGGING HERE
                    }
                }
            }
        }
    }