错误提示:“此游标当前指向的消息已由不使用此游标的另一个进程或另一个 Receive 调用从队列中移除。”我用数据库填充消息队列,使用程序每隔一段时间检查一下消息队列的个数:比如1000,如果小于这个数字,就用一个子线程填充此队列,同时另一个子线程,不停地从消息队列中取出Message,进行下面的操作。大概就是这样一个过程。现在的问题就像上面的错误提示,我用 queue.GetAllMessages().length 判断消息个数,用Receive()获取消息,但这两个操作好像有冲突,不经常有,隔一段时间可能就出现一次,造成程序崩溃请教一下,该如何解决?
解决方案 »
- 怎么把一个字符串,当做js来执行?
- C# Windows Installer中自述文件和许可协议两个对话框设置问题?
- datagridview 难道每个列都用同一个对象? 不可能吧
- C#中 怎样获取xml的命名空间?
- C# 服务器端如何创建文件夹。路过请看。
- 如何使MDI窗体的子窗体拥有独立的菜单,运行时不与主菜单合并? 急急!!!在线等,!!
- 关于通过datagrid更新access数据库的问题(附代码)
- 数据库应该如何建立呢
- 请问大侠们有没有硬盘数据恢复的代码?非常感谢!急~~~
- C#上位机与PLC通信,测试程序,偶尔会出现界面卡死,不能进行数据采集。
- 【急】用vs2008打包,为什么快捷方式不指向exe文件而是指向文件夹?
- C#多线程并发的问题
并发操作问题 lock锁代码试试
/// 获取消息队列数量
/// </summary>
/// <returns></returns>
public static int MsgCount()
{
MessageQueue queue = new MessageQueue(@".\Private$\MyPublicQueue");
Message[] strMsg = null;
if (queue.GetAllMessages() != null && queue.GetAllMessages().Length > 0)
{
strMsg = queue.GetAllMessages();
} return strMsg.Length;
} /// <summary>
/// 填充消息队列
/// </summary>
public static void FillMsgQueue()
{
MessageQueue queue = null;
string queueName = @".\Private$\MyPublicQueue";
if (MessageQueue.Exists(queueName))
queue = new MessageQueue(queueName);
else
queue = MessageQueue.Create(queueName, false);
while (true)
{
int msgCount = MsgCount();
if (msgCount < 100)
{
//获取25条消息实例
List<Position_51> list = WebGeter.Code.GeterDAL.SelectTopNUrl(); //发送消息实例,填充队列
for (int i = 0; i < list.Count; i++)
{
SendMsg(list[i]);
}
}
//System.Threading.Thread.Sleep(1000);
}
}
把他拿出来,不要放在方法里。拿出来作为所有方法都能访问的变量。然后
lock(queue)
{
1。判断
2。添加
}
当某些其他光标、应用程序或系统管理员已从队列中移除该消息时,消息队列返回此错误。当使用 MessageEnumerator 类(例如通过对 MessageQueue.GetMessageEnumerator 或 MessageQueue.GetEnumerator 的调用返回的实例)时最可能发生该错误。