还是一个关于多线程查询数据库出现多个线程查出同一条记录的的问题。
表里本身有个字段,就是判断是否被查询过的。查询过的后的字段被改为false,就不再查询。
但是发觉还是一样,比如用了3线程,同一条记录还是被查处三次。
示例如下:
首先在form1类中
private static void createThread()
{
for (int b = 0; b < 3; b++)
{
Thread thread = new Thread(new ThreadStart(sendMessage));
thread.IsBackground = true;
thread.Name = b.ToString();
thread.Start();
}
}private static void sendMessage()
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
...
...
//这里面有数个需要查询不同表的数据,都是getdata这个类中的方法
Thread.Sleep(500);
sendMessage();
}//GetData类中:
public Record getNotSendMessage()
{
string sql = "getNotSendMessage";
SqlDataReader reader = null;
try
{
DBHelper dbhelp = new DBHelper();
reader = dbhelp.ExecuteProcSelect(sql);
if (reader.Read())
{
Record record = new Record();
...
...
reader.Close();
return record;
}
reader.Close();
dbhelp.closeConnection();
return null;
}
catch (Exception e)
{
...
...
}
} ...
... //也是数个查询方法//DBHelper 类中 public SqlConnection Connection
{
get
{
string connectionString ="数据库连接语句";
if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State ==ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
} public void closeConnection()
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
}
} public SqlDataReader ExecuteProcSelect(string procName, params SqlParameter[] values)
{ SqlCommand cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
SqlDataReader sdr = cmd.ExecuteReader();
return sdr;
}
...
... 现在主要的是sendMessage所有方法获取数据库中的数据如何让其不重复读取一条,
我试过用用lock都还是不行,在下很少用到线程..所请各位前辈帮帮忙!
表里本身有个字段,就是判断是否被查询过的。查询过的后的字段被改为false,就不再查询。
但是发觉还是一样,比如用了3线程,同一条记录还是被查处三次。
示例如下:
首先在form1类中
private static void createThread()
{
for (int b = 0; b < 3; b++)
{
Thread thread = new Thread(new ThreadStart(sendMessage));
thread.IsBackground = true;
thread.Name = b.ToString();
thread.Start();
}
}private static void sendMessage()
{
GetData getdata = new GetData();
Record record = getdata.getNotSendMessage();
...
...
//这里面有数个需要查询不同表的数据,都是getdata这个类中的方法
Thread.Sleep(500);
sendMessage();
}//GetData类中:
public Record getNotSendMessage()
{
string sql = "getNotSendMessage";
SqlDataReader reader = null;
try
{
DBHelper dbhelp = new DBHelper();
reader = dbhelp.ExecuteProcSelect(sql);
if (reader.Read())
{
Record record = new Record();
...
...
reader.Close();
return record;
}
reader.Close();
dbhelp.closeConnection();
return null;
}
catch (Exception e)
{
...
...
}
} ...
... //也是数个查询方法//DBHelper 类中 public SqlConnection Connection
{
get
{
string connectionString ="数据库连接语句";
if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State ==ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
} public void closeConnection()
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
}
} public SqlDataReader ExecuteProcSelect(string procName, params SqlParameter[] values)
{ SqlCommand cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
SqlDataReader sdr = cmd.ExecuteReader();
return sdr;
}
...
... 现在主要的是sendMessage所有方法获取数据库中的数据如何让其不重复读取一条,
我试过用用lock都还是不行,在下很少用到线程..所请各位前辈帮帮忙!
解决方案 »
- 怎么限定datagridview里头每个CELL的值全都大于1024呀?
- 获取页面的所有内容,包括js加载的内容
- 几个文件的含义,散分
- 禁止IE中的弹出广告
- 如何在一个解决方案中使用一个资源文件
- 我想把数据库一张表的查询结果显示到窗体的文本框中 结果显示不出来
- 多个网站,一个服务器一个网站,共用一个数据库。求一个稳定的方案。
- C# web窗体上的控件哪里去了???????????
- c#中结构数组怎么定义?怎么获取一个字符的ascii码?
- 关于tcp接收消息问题!(高手近来,底手也来学学,答对马上给分)
- 菜鸟提问~~web.config中的identity impersonate="false"问题
- DataGridView问题
Monitor.Enter(myLockMe);
//监控器锁定重要代码段Monitor.Exit(myLockMe);
然后对这个DataTable采用多线程
Monitor.Enter(myLockMe);
//监控器锁定重要代码段Monitor.Exit(myLockMe);
这个或者LOCK我都试过,必须把我的整个sendMessage()这个方法内容全部包含进去确实就是了。
但是这样其实就跟单线程什么区别了呀。
我想要的就是获取数据库的过程取出来不重复的,其它的照样运行,这样就可以先处理完提交给远程服务器的线程可以立即进行下一条..效率会高很多...因为取出数据库中的速度很快,但是提交给远程服务器的速度慢很多..