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
}
}
}
}
}