Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中不使用ODBC.DataReader将数据传递给另一个类#_C#_Multithreading_Datareader - Fatal编程技术网

C# 在C中不使用ODBC.DataReader将数据传递给另一个类#

C# 在C中不使用ODBC.DataReader将数据传递给另一个类#,c#,multithreading,datareader,C#,Multithreading,Datareader,我正在尝试制作一个多线程程序,从另一家公司持有的服务器中提取大量的数据线程。当前,一旦线程提取了数据,它就会使用OdbcDataReader读取该数据。但最终,我想做的是将数据传递给另一个不同的线程,该线程将使用读取器读取和解析数据,以便当前线程可以继续从数据库中提取更多数据 目前,这里是线程的代码,直到读卡器到达该点为止 public class plexThread { OdbcConnection connection; OdbcCommand co

我正在尝试制作一个多线程程序,从另一家公司持有的服务器中提取大量的数据线程。当前,一旦线程提取了数据,它就会使用OdbcDataReader读取该数据。但最终,我想做的是将数据传递给另一个不同的线程,该线程将使用读取器读取和解析数据,以便当前线程可以继续从数据库中提取更多数据

目前,这里是线程的代码,直到读卡器到达该点为止

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();
                                    }
公共类线程
{
ODBC连接;
ODBC命令;
字符串sqlStatement;
OdbcDataReader;
字符串线程数;
日期时间开始日期;
日期时间结束日期;
公共线程(字符串threadNumber)
{
连接=新的ODBC连接(“XXXX”);
this.threadNumber=threadNumber;
}
公共线程()
{            
尝试
{
connection.Open();
startDate=ThreadInfo.useStartDate();
endDate=ThreadInfo.getEndDate();
DateTime timerStart=新建日期时间();
DateTime now=DateTime.now;
int超时=0;
捕获布尔数据;

while(startDate您是否尝试过使用异步读取器


参考资料:

看起来您正在实现生产者/消费者模式

一个解决方案是使用。当前线程可以将从读卡器读取的数据发布到阻塞集合,并且一个单独的线程可以从阻塞集合读取数据,直到没有更多的数据可使用为止


链接的MSDN页面底部有一个很好的示例。

始终执行线程安全编程。现在,通过提供线程安全集合,Microsoft使开发人员更容易使用

见:

例如,一个线程可以不断向集合添加数据,它可以是
ConcurrentQueue
ConcurrentBag
BlockingCollection
,等等。 其他线程可以继续从中读取