在 C# 中不使用 ODBC.DataReader 将数据传递给另一个 class
Passing data to another class without using ODBC.DataReader in C#
我正在尝试制作一个多线程程序,从另一家公司持有的服务器中提取大量数据线程。目前,一旦一个线程提取了数据,它就会使用 OdbcDataReader 来读取该数据。但最终,我想做的是将该数据传递给另一个不同的线程,该线程将使用 reader 读取和解析数据,以便当前线程可以继续从数据库中提取更多数据。
目前这里是线程的代码,直到 reader。
public class plexThread
{
OdbcConnection connection;
OdbcCommand command;
string sqlStatement;
OdbcDataReader reader;
string threadNumber;
DateTime startDate;
DateTime endDate;
public plexThread(string threadNumber)
{
connection = new OdbcConnection("XXXX");
this.threadNumber = threadNumber;
}
public void plexthread()
{
try
{
connection.Open();
startDate = ThreadInfo.useStartDate();
endDate = ThreadInfo.getEndDate();
DateTime timerStart = new DateTime();
DateTime now = DateTime.Now;
int timeout = 0;
bool dataCaptured;
while (startDate <= endDate)
{
dataCaptured = false;
DateTime startDatePlusDay = startDate.AddDays(+1);
Console.WriteLine("Thread" + threadNumber + " is picking up day: " + startDate);
string startDateString = startDate.ToString("yyyy-MM-dd");
string startDatePlusDayString = startDatePlusDay.ToString("yyyy-MM-dd");
sqlStatement = "call sprocXXXX(null, null, '" + startDateString + "', '" + startDatePlusDayString + "', null, null,null,null,'',null,null,null,null,null,null,'', 164407);";
command = new OdbcCommand(sqlStatement, connection);
while (dataCaptured == false)
{
if (timeout <= 5)
{
try
{
reader = command.ExecuteReader();
int fieldCount = reader.VisibleFieldCount;
while (reader.Read())
{
for (int i = 0; i < fieldCount; i++)
{
string data = reader[i].ToString();
}
不确定最好的方法是什么?
您是否尝试过使用异步 Reader?
您似乎在实施 Producer/Consumer 模式。
一个固解是使用BlockingCollection。您当前的线程可以 post 从 reader 读取数据到阻塞集合,一个单独的线程可以从阻塞集合读取数据,直到没有更多数据可以使用。
链接的 MSDN 页面底部有一个很好的示例。
始终进行线程安全编程。现在,通过提供线程安全的集合,Microsoft 使开发人员的工作变得更加轻松。
参见:MSDN- Thread-Safe Collections
例如,一个线程可以不断向集合中添加数据,可以是ConcurrentQueue<T>
、ConcurrentBag<T>
、BlockingCollection<T>
等。
其他线程可以继续读取它。
我正在尝试制作一个多线程程序,从另一家公司持有的服务器中提取大量数据线程。目前,一旦一个线程提取了数据,它就会使用 OdbcDataReader 来读取该数据。但最终,我想做的是将该数据传递给另一个不同的线程,该线程将使用 reader 读取和解析数据,以便当前线程可以继续从数据库中提取更多数据。
目前这里是线程的代码,直到 reader。
public class plexThread
{
OdbcConnection connection;
OdbcCommand command;
string sqlStatement;
OdbcDataReader reader;
string threadNumber;
DateTime startDate;
DateTime endDate;
public plexThread(string threadNumber)
{
connection = new OdbcConnection("XXXX");
this.threadNumber = threadNumber;
}
public void plexthread()
{
try
{
connection.Open();
startDate = ThreadInfo.useStartDate();
endDate = ThreadInfo.getEndDate();
DateTime timerStart = new DateTime();
DateTime now = DateTime.Now;
int timeout = 0;
bool dataCaptured;
while (startDate <= endDate)
{
dataCaptured = false;
DateTime startDatePlusDay = startDate.AddDays(+1);
Console.WriteLine("Thread" + threadNumber + " is picking up day: " + startDate);
string startDateString = startDate.ToString("yyyy-MM-dd");
string startDatePlusDayString = startDatePlusDay.ToString("yyyy-MM-dd");
sqlStatement = "call sprocXXXX(null, null, '" + startDateString + "', '" + startDatePlusDayString + "', null, null,null,null,'',null,null,null,null,null,null,'', 164407);";
command = new OdbcCommand(sqlStatement, connection);
while (dataCaptured == false)
{
if (timeout <= 5)
{
try
{
reader = command.ExecuteReader();
int fieldCount = reader.VisibleFieldCount;
while (reader.Read())
{
for (int i = 0; i < fieldCount; i++)
{
string data = reader[i].ToString();
}
不确定最好的方法是什么?
您是否尝试过使用异步 Reader?
您似乎在实施 Producer/Consumer 模式。
一个固解是使用BlockingCollection。您当前的线程可以 post 从 reader 读取数据到阻塞集合,一个单独的线程可以从阻塞集合读取数据,直到没有更多数据可以使用。
链接的 MSDN 页面底部有一个很好的示例。
始终进行线程安全编程。现在,通过提供线程安全的集合,Microsoft 使开发人员的工作变得更加轻松。
参见:MSDN- Thread-Safe Collections
例如,一个线程可以不断向集合中添加数据,可以是ConcurrentQueue<T>
、ConcurrentBag<T>
、BlockingCollection<T>
等。
其他线程可以继续读取它。