Asp.net 2008,在线程里和窗体上调用同一个方法,为什么效果不一样,有部分代码没走??
本人用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 "";
}
}
}
--------------------编程问答-------------------- 如果你的这个发送短信遇到异常,这个循环就不会再进行了.
--------------------编程问答-------------------- .net线程间的调用是要通过委托的啊。 --------------------编程问答-------------------- 像这种定时做的事,最好用winform来做,
--------------------编程问答-------------------- 顶,关注…… --------------------编程问答-------------------- 貌似和你的deleSQF 委托有关系 不太清楚 帮顶 --------------------编程问答-------------------- 用System.Threading.Timer --------------------编程问答--------------------
你用的是access数据库,数据库链接你肯定是Server.MapPath(相对路径)
在多线程下,Server.MapPath被非web线程使用就导致异常,循环就停止了。
换一下。
/// <summary>
/// 获得绝对路径
/// </summary>
/// <param name="strPath">相对路径</param>
/// <returns>绝对路径</returns>
public static string MapPath(string strPath)
{
if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(strPath);
}
else //非web程序引用
{
strPath = strPath.Replace("/", "\\");
if (strPath.StartsWith("\\"))
{
strPath = strPath.TrimStart('\\');
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
} --------------------编程问答-------------------- 不过就算你解决了bug,这个定时功能也没有实际用途。
网站20分钟没有人访问,iis 就回收掉了。一切都停止了。
你还得多写个线程定时访问网站的一个空白.aspx的网页。 --------------------编程问答-------------------- deleSQF 委托没有问题,只是在线程里调用时不走委托里的getSMSContent方法,而在窗体按钮单击时就能调用到委托进去, --------------------编程问答-------------------- 在线程里不执行委托回调getSMSContent方法
补充:.NET技术 , ASP.NET