Tom*_*han 1 .net c# vb.net asp.net multithreading
我在 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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
更新/澄清:在调用线程版本时,我仍然收到对客户端的预期响应 - 没有错误消息。
我还在上面的代码中包含了一个被遗忘的方法。
更新 2: @Henk,不幸的是我没有调试的能力,因为这个问题只出现在我们锐利的服务器上,它没有安装 Visual Studio 并且不允许远程调试。
但是,该SendSMS方法向我的手机发送短信,短信网络服务和我的手机都同意在调用“on”或“off”时发送消息,但在调用“larma”时不发送。
由于我知道整个链 Handler-> StartaLarm->SandSMS(True/False)适用于“on”和“off”,我必须假设故障发生在 Handler-> Larma-> 的某处Larma_Thread,因此是一个线程问题。
更新 3:@Vadmyst,在将您的代码转换为 VB.NET(这也不是我最喜欢的两个,但这个项目需要它......)并修改它以进行编译后,我得到了以下内容(尽管我是不是 100% 确定它仍然意味着同样的事情......):
ThreadPool.QueueUserWorkItem(New WaitCallback(Function(p As Integer) Larma_Thread(p)))
Run Code Online (Sandbox Code Playgroud)
没有成功 - 我的结果与上面相同...... =(
在辅助线程的上下文中SandSMS调用 fromStartaLarm调用中有一个异常Larma_Thread。多线程应用程序中的“什么也没发生”行为是辅助线程中异常的强烈指示。,想到的第一件事,就是在Web应用程序的非请求线程不同的是,非请求的线程不具有访问Request,Context,Session和这样的。