[救命啊]高分求救!不够再加!C#多线程问题

cowlilian 2006-04-28 05:37:21
短信发送,利用多线程发布,其实很简单。

开始,主线程每隔1秒去数据库读取待发信息。然后放入QUEUE

有20个子线程,用来发送信息。从QUEUE中获取待发信息,然后发送。


现在的问题是,这个程序在XP和2000上都没有问题。但是在2003上,有时候会出现数据已经读取,但是没有发送出去,20个子线程好象没事做。

200条信息记录会出现3到5条被卡住的情况。

请各位大虾帮帮忙。
...全文
247 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cowlilian 2006-04-29
  • 打赏
  • 举报
回复
TO soaringbird
20个线程一直在跑,“卡住”后,如果再插入新数据,也会发送,但是就有那么几个,3到5个会“卡住”。

TO helloworld
我也在考虑不要用队列,但是不用队列,每个线程都去访问数据库的话,数据库负担很重啊。
wangsaokui 2006-04-29
  • 打赏
  • 举报
回复
1 检查是否有短信从QUEUE中取出
2 你的发送代码是从哪里来的?自己写的或别人提供的?如别人提供的有没有限制条件?
发送代码是否运行?有无异常抛出?
bearocean 2006-04-29
  • 打赏
  • 举报
回复
平台相关性不好弄。
尝试换个方法。不用队列。
用数组看看。
soaringbird 2006-04-29
  • 打赏
  • 举报
回复
在你的线程循环里加些调试信息,看看线程到哪就不走了,还是从队列里取不出东西来。
canjianchangkong 2006-04-29
  • 打赏
  • 举报
回复
在XP和2000都能用了,就那樣吧,純頂
cowlilian 2006-04-29
  • 打赏
  • 举报
回复
TO:信仰t
我试试看,谢谢。

TO:soaringbird
有加锁。谢谢
soaringbird 2006-04-29
  • 打赏
  • 举报
回复
多线程共用一个Queue实例?那你加没加锁?是不是被某个线程死锁住了
xinyangt 2006-04-29
  • 打赏
  • 举报
回复
楼主检查一下 访问权限问题 比如存放消息队列的路径是否允许用户的操作等
2003在权限上的限制比多要自己改一下
在2003上跑程序经常会有这样的问题
cowlilian 2006-04-29
  • 打赏
  • 举报
回复
头疼的问题是,这个程序在 XP 和 2000 上调试都没有问题,但是在2003上就不行了。经常会出现“卡住”的现象。

郁闷啊。

是不是2003的系统安全或者系统任务管理的问题导致的呢?

小弟不懂。希望大家帮帮忙。
cowlilian 2006-04-29
  • 打赏
  • 举报
回复
TO:我是菜鸟
谢谢!

TO:夕阳轨迹
这段代码不是很适合我,谢谢

TO:soaringbird
我是用网关发送,由于对方是ASP,可以使用多线程。业务上的需要,有时候是批量发送短信的,所以得开多线程。谢谢

TO: 起步停车
代码调试中,短信未发送出去,而且我每次发送短信都是从QUEUE中获取的。即是说,线程要发送的短信,是从QUEUE里面PUSH出来的。
wangsaokui 2006-04-28
  • 打赏
  • 举报
回复
有时候会出现数据已经读取,但是没有发送出去

调试你的发送代码,是否发送,另发送后是否从 Queue中remove信息
soaringbird 2006-04-28
  • 打赏
  • 举报
回复
看看堵住的情况有什么规律。
你拿什么设备发的短信,需要开20个发送线程?
yurow 2006-04-28
  • 打赏
  • 举报
回复
查找是什么地方占的资源

这是我以前写的灌水机的部分发送代码(VB.Net 2003)

Dim myHttpWebRequest1 As HttpWebRequest = CType(WebRequest.Create(postUrl), HttpWebRequest)

If Not (Me.Cookies Is Nothing) Then
myHttpWebRequest1.CookieContainer = Me.Cookies
Else
myHttpWebRequest1.CookieContainer = New Net.CookieContainer
Me.Cookies = myHttpWebRequest1.CookieContainer
End If

Dim myRequestState As New xpasp_com.RequestState
myRequestState.request = myHttpWebRequest1
myHttpWebRequest1.AllowAutoRedirect = True
myHttpWebRequest1.ContentType = "application/x-www-form-urlencoded"
myHttpWebRequest1.Method = "POST"
myHttpWebRequest1.Timeout = 20 * 1000

Dim postStream As Stream = myHttpWebRequest1.GetRequestStream
Dim encoder As System.Text.Encoding = System.Text.Encoding.GetEncoding("gb2312")
Dim ByteArray As Byte() = encoder.GetBytes(postStr)
postStream.Write(ByteArray, 0, postStr.Length)
postStream.Close()
Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest1.GetResponse(), HttpWebResponse)

If tid = 0 Or CheckBox8.CheckState Then

Dim streamResponse As Stream = myHttpWebResponse.GetResponseStream()
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("gb2312")
'MsgBox(myHttpWebResponse.ResponseUri().ToString)
Dim streamRead As New StreamReader(streamResponse, enc)
Dim readBuff(256) As [Char]
Dim count As Integer = streamRead.Read(readBuff, 0, 256)
Console.WriteLine(ControlChars.Cr + "The contents of HTML Page are : ")

Dim fs As New FileStream(selectPath & "\System\Temp\F1.htm", FileMode.Create)
Dim sw As New StreamWriter(fs, enc)

While count > 0
Dim outputData As New [String](readBuff, 0, count)
Console.WriteLine(outputData)
sw.WriteLine(outputData)
count = streamRead.Read(readBuff, 0, 256)
End While

sw.Close()
fs.Close()
If CheckBox8.CheckState Then
Shell("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE " + selectPath & "\System\Temp\F1.htm", 1)
End If
streamResponse.Close()
streamRead.Close()
'allDone.WaitOne()

End If
myHttpWebResponse.Close()
zjk96321 2006-04-28
  • 打赏
  • 举报
回复
先占一楼帮顶一下

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧