我有一个奇怪的ASP.NET应用程序中的线程问题。出于某种原因,当我在请求线程中运行代码时,一切都按预期工作。但是当我在一个单独的线程中运行它时,没有任何反应。
这是通过调用下面的处理程序分别用“on”,“off”和“larma”三个标志来验证的 - 在前两种情况下一切正常,但后者没有任何反应。这种线程方式为什么不起作用?
我在做什么错在这里?
在Web项目中,我有下面的代码的通用处理器:
If task = "on" Then
Alarm.StartaLarm(personId)
context.Response.Write("Larmet är PÅ")
ElseIf task = "off" Then
Alarm.StoppaLarm(personId)
context.Response.Write("Larmet är AV")
ElseIf task = "larma" Then
Alarm.Larma(personId)
context.Response.Write("Larmar... (stängs av automagiskt)")
Else
context.Response.Write("inget hände - task: " & task)
End If
的Alarm
类有以下方法:
Public Shared Sub Larma(ByVal personId As Integer)
Dim thread As New System.Threading.Thread(New ParameterizedThreadStart(AddressOf Larma_Thread))
thread.Start(personId)
End Sub
Private Shared Sub Larma_Thread(ByVal personId As Integer)
StartaLarm(personId)
Thread.Sleep(1000 * 30)
StoppaLarm(personId)
End Sub
Public Shared Sub StartaLarm(ByVal personId As Integer)
SandSMS(True, personId)
End Sub
Public Shared Sub StoppaLarm(ByVal personId As Integer)
SandSMS(False, personId)
End Sub
Public Shared Sub SandSMS(ByVal setOn As Boolean, ByVal personId As Integer)
...
End Sub
UPDATE /澄清:我仍然得到在调用线程版本时对客户端的预期响应 - 无错误消息。
我还在上面的代码中包含了一个被遗忘的方法。
更新2: @Henk,不幸的是我没有调试能力,因为这个问题只有我们尖锐服务器,它没有安装Visual Studio和不允许远程调试上出现。
但是,SendSMS
方法会向我的手机发送文本消息,并且文本消息Web服务和我的电话都同意在调用“on”或“off”时发送消息,但不会在调用“larma”时发送消息。
因为我知道,整个链条Handler->StartaLarm
- >SandSMS(True/False)
作品“开”和“关”,我必须假设,在Handler->Larma
某处出现故障 - >Larma_Thread
,因而是一个穿线问题。
更新3:@Vadmyst,将您的代码转换为VB.NET(这不是我最喜欢的两个,但这个项目需要它...)并修改它编译,我到达了下面的(虽然我不是100%肯定它仍然意味着同样的事情...):
ThreadPool.QueueUserWorkItem(New WaitCallback(Function(p As Integer) Larma_Thread(p)))
没有成功 - 我也有同样的结果如上... =(
这一澄清说线程版本的工作? – 2010-06-16 11:42:51
@亨克:没有 - 没有工作,只是没有给出任何错误。正如您在代码中看到的,我启动了一个不同的线程来执行这些任务,然后向客户端返回一个字符串。字符串被返回,但是任务没有被执行。对不起,没有更清楚。 – 2010-06-16 12:01:49
你是否让Denug找出2个SendSMS调用是否被实际执行? – 2010-06-16 13:51:19