Asp.net 2008,在线程里和窗体上调用同一个方法,为什么效果不一样,有部分代码没走??
ttf1 2009-09-07 10:09:45 本人用asp.net2008做了个短信系统,在Global.asax线程里半分钟,进行一次短信的收发,问题是有部份正常代码不执行,不知为什么?或有什么好方法来解决半分钟执行一次,页面刷新是一个方法可能?还有其它的吗?
Asp.net 2008,在线程里和窗体上调用同一个方法,为什么效果不一样,有部分代码没走??
在下面(1)和(2)中调用(3)中的一个方法ReceivedMsg(),可是在(1)调用时不执行(3)中的getSMSContent()这个静态方法,而在(2)调用时就执行,
请问为什么线程执行方式和普通的不一样?
怎么样修改成能执行的呢?
(1).Global.asax线程代码:
private System.Threading.Thread thdAuto = null;
void thdOperator(object sender)
{
while (true)
{
ZHSMS.SMS.BLL.SmsBll Sms = new ZHSMS.SMS.BLL.SmsBll(ZHSMS.SMS.BLL.Common.checkUserName, ZHSMS.SMS.BLL.Common.checkPassword, ZHSMS.SMS.BLL.Common.checkDateTime);
//添加接收记录
Sms.ReceivedMsg();
System.Threading.Thread.Sleep(30000);
}
}
protected void Application_Start(object sender, EventArgs e)
{
System.Threading.ParameterizedThreadStart thdStart = new System.Threading.ParameterizedThreadStart(thdOperator);
thdAuto = new System.Threading.Thread(thdStart);
thdAuto.Start();
}
(2).SendMessage.aspx窗体按钮事件中代码:
protected void btnSend_Click(object sender, EventArgs e)
{
string strValue;
ZHSMS.SMS.BLL.SmsBll Sms = new ZHSMS.SMS.BLL.SmsBll(ZHSMS.SMS.BLL.Common.checkUserName, ZHSMS.SMS.BLL.Common.checkPassword, ZHSMS.SMS.BLL.Common.checkDateTime);
//添加接收记录
Sms.ReceivedMsg();
}
(3).SmsBll.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Runtime.InteropServices;
using ZHSMS.SMS.Data.ACC;
namespace ZHSMS.SMS.BLL
{
public class SmsBll
{
private int eModemStatus;
private const int OK_STATUS = 1;
private SmsAcc smsAcc = new SmsAcc();
private static string fromNumber;
private static string arrivedTime;
private static string msgContent;
private static int msgType;
[DllImport("EUCPComm.dll", EntryPoint = "ReceiveSMS")] // 接收短信
public static extern int ReceiveSMS(string sn, deleSQF mySmsContent);
//回调(接收短信)
static void getSMSContent(string mobile, string senderaddi, string recvaddi, string ct, string sd, ref int flag)
{
//string mob = mobile;
//string content = ct;
//int myflag = flag;
//MessageBox.Show(mob + "----" + content);
fromNumber = mobile;
arrivedTime = sd;
msgContent = ct;
msgType = flag;
}
public delegate void deleSQF(string mobile, string senderaddi, string recvaddi, string ct, string sd, ref int flag);
deleSQF mySmsContent = new deleSQF(getSMSContent);
public string ReceivedMsg()
{
try
{
//网关发送短信
if (eModemStatus != OK_STATUS)
{
if (!SmsConn())
{
return "未注册成功";
}
}
deleSQF mySmsContent = new deleSQF(getSMSContent);
//接收短信 序列号 函数指针
int result = 2;
while (result == 2) //当result = 2 时,说明还有下一批短信等待接收,这时需重新再调用一次ReceiveSMS方法
{
fromNumber = "";
arrivedTime = "";
msgContent = "";
msgType = 0;
result = ReceiveSMS(Common.SysInfo.strSerialNumber, mySmsContent);
if (result == 1 && msgType == 1)
{
//将短信接收内容添加到ACCESS库中
smsAcc.InsertReceivedMsg(fromNumber, msgContent, Common.StringToDate(arrivedTime), "9");
}
else if (result == 101)
return "网络故障";
else if (result == 102)
return "其它故障";
else if (result == 105)
return "参数指针为空";
else if (result == 0)
return "失败";
else if (result == -1)
return "未知故障";
}
}
catch (Exception Ex)
{
return Ex.ToString();
}
finally
{
//关闭短信联接
SmsDisConn();
}
return "";
}
}
}