深圳市未来时代科技有限公司
标题:
c# 短信多卡设备开发移动空充平台
[打印本页]
作者:
mrtraum
时间:
2015-1-9 09:29
标题:
c# 短信多卡设备开发移动空充平台
我用的.net 的SerialPort 发送AT指令开发的!刚开始,发送一个线程,接受一个线程
因为都是用的同一个类中的同一个方法发送的AT指令
所以,有时候会提示,线程退出
其它信息:System.IO.IOException: 由于线程退出或应用程序请求,已中止 I/O 操作。
在 ModemProcess.Common.GSMModem.SendAT(String ATCom) 位置 f:\短信猫\ModemSingleProcess\ModemProcess\Common\GSMMODEM.cs:行号 364
在 ModemProcess.Common.GSMModem.DelReadAllMsg() 位置 f:\短信猫\ModemSingleProcess\ModemProcess\Common\GSMMODEM.cs:行号 548
在 ModemProcess.ModemConsoleForm1.gsm_OnRecieved(Object sender, EventArgs e) 位置 f:\短信猫\ModemSingleProcess\ModemProcess\ModemConsoleForm1.cs:行号 415
复制代码
在SendAT中加了lock也不管用、不知道什么原因。。。
还有就是有3个短信收发设备,一个新的好用,端口什么时候都能打开正常,发送正常
但是旧的一个猫池总是打开失败,或者发送超时
作者:
mrtraum
时间:
2015-1-9 09:32
/// <summary>
/// 扫描订单集合启动发送短信委托
/// </summary>
public void GsmStartSendMessage(object o)
{
try
{
SmartThreadPool stp = new SmartThreadPool();//这里演示了线程的分组
//创建一个分组并用这个分组管理
//如果需要设置这个分组为调用start的时候才开始运行,需要传入WIGStartInfo参数,将其参数中的StartSuspended设置为true然后调用分组的start方法
IWorkItemsGroup mainGroup = stp.CreateWorkItemsGroup(30);
mainGroup.OnIdle += mainGroup_OnIdle;
while (true)
{
_areSendMsg.WaitOne();
Thread.Sleep(1000);
//扫描订单集合
foreach (var keyValuePair in sendQueue)
{
KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>> pair = keyValuePair;
if (pair.Value.Count == 0)
{
continue;
}
if (pair.Key.IsTakeUp)
mainGroup.QueueWorkItem(new WorkItemCallback(ExecuteGsmSendMessage), pair);
//ExecuteGsmSendMessage(pair);
}
//分组等待所有任务完成
mainGroup.WaitForIdle();
}
}
catch (Exception ex)
{
_log.Error(ex);
DelegateValue("GsmStartSendMessage" + ex.Message);
}
}
复制代码
/// <summary>
/// 发送短信委托
/// </summary>
/// <param name="queue"></param>
/// <param name="gsm"></param>
public object ExecuteGsmSendMessage(object o)
{
ConcurrentQueue<SMSServerModel> queue = ((KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>>)o).Value;
GSMMONDEMABS gsm = ((KeyValuePair<GSMMONDEMABS, ConcurrentQueue<SMSServerModel>>)o).Key;
try
{
ConcurrentQueue<SMSServerModel> tempQueue = queue;
while (tempQueue.Count > 0)
{
Thread.Sleep(4000);
string comName = string.Empty;
string phone = string.Empty;
try
{
SMSServerModel obj = null;
if (tempQueue.TryDequeue(out obj))
{
if (!gsm.IsTakeUp)
{
continue;
}
if (!gsm.IsOpen)
{
gsm.Open();
}
comName = gsm.ComPort;
obj.COMNO = gsm.ComPort;
phone = obj.PREPAID_PHONE_NO;
var msgText = gsm.ComModel.Pwd + "," + obj.PREPAID_PHONE_NO + "," + obj.MONEY;
//充值短信格式:密码,手机号,金额
gsm.SendMsg("10086500", msgText);
bool bl = Bll.SendMsgUpdateByOrder(DateTime.Now.ToString(), "1", msgText, obj.ORDERNO,
gsm.ComModel.PhoneNumber, obj.COMNO);
alreadySendList.Add(obj);
DelegateValue(obj.COMNO + ": " + msgText + " (" + obj.BELONGINGTO + ")发送成功,ThreadId:" +
Thread.CurrentThread.ManagedThreadId + " (更新数据" + (bl ? "成功)" : "失败)"));
this.Invoke(new Action(delegate
{
this.lblsum.Text = "当前订单数:" + sendQueue.Sum(q => q.Value.Count);
}));
}
}
catch (Exception ex)
{
DelegateValue(comName + " 发送短信异常:" + phone + ex);
}
finally
{
//if (!sendQueue.Any(q => q.Value.Count > 0))
//{
// _areReaddb.Set(); //通知读取数据库
// _areSendMsg.Reset(); //停止发送短信线程
//}
}
}
}
catch (Exception ex)
{
DelegateValue("ExecuteGsmSendMessage" + ex);
_log.Error(ex);
}
return 0;
}
复制代码
void mainGroup_OnIdle(IWorkItemsGroup workItemsGroup)
{
if (!sendQueue.Any(q => q.Value.Count > 0))
{
_areReaddb.Set(); //通知读取数据库
_areSendMsg.Reset(); //停止发送短信线程
}
}
复制代码
还有怎么优化,可以支持多线程发送。一个端口起一个线程,并行发送
作者:
admin
时间:
2015-1-9 17:25
对于你的开发问题我就不懂了,然后你上面说3个猫,新的可以久的不行,你要先确定下两个猫使用的波特率是否都相同,还有看看两个猫获取得到的信号是否都一样,先用超级终端来测试清楚再进行连接测试。
欢迎光临 深圳市未来时代科技有限公司 (http://inextera.com/)
Powered by Discuz! X3.1