c# - 为什么这种线程化方法不起作用?

标签 c# .net asp.net vb.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
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

更新/声明:调用线程版本时,我仍然得到对客户端的预期响应-没有错误消息。

我还在上面的代码中包括了一个被遗忘的方法。

更新2:
@Henk,很遗憾,我没有调试能力,因为此问题仅出现在我们的尖锐服务器上,该服务器没有安装Visual Studio,并且不允许进行远程调试。

但是,SendSMS方法将文本消息发送到我的电话,并且文本消息Web服务和我的电话都同意在调用“开”或“关”时发送消息,而在调用“拉玛”时不发送消息。

因为我知道整个链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)))

没有成功-我得到的结果与上述相同... =(

最佳答案

在辅助线程的上下文中,从SandSMS调用的StartaLarm调用的Larma_Thread中存在异常。多线程应用程序中的“什么也没有发生”行为是辅助线程中异常的有力指示。首先想到的是,与Web应用程序的非请求线程不同的是,非请求线程无法访问RequestContextSession等。

关于c# - 为什么这种线程化方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3052200/

相关文章:

c# - 指纹识别器

c# - .NET 中的双倍乘法是否损坏?

c# - log4net配置问题

asp.net - 仅 SSL 和 key 代码就足以保证 Web API 的安全吗?

c# - 未找到数据源名称且未指定默认驱动程序

c# - NLog ASP.Net 查看器

c# - 使用Azure功能处理Azure服务总线队列消息

c# - 修改 Linq 查询以支持可选关系

.net - .NET 4.0 是否存在 mdbg 托管调试器示例?

c# - 单例实现问题