会话变量是否跨线程共享?

时间:2015-06-11 18:39:40

标签: asp.net vb.net multithreading session

我正在开发一个VB.Net项目,我想要一个快速而又脏的方法让第二个线程预先形成一些函数,然后将一些变量结果存储到会话中。然后我想从第一个线程(当然在同一个会话中)访问该变量。

以下是代码示例...

按钮#1

Sub button_Click1(byVal sender As Object, ByVal e As Event Args)

textfield1.Visible = False
lable2.Visible = True
textfield2.Visible = True
button_Click2.Visible = True

Dim thread2 As New System.Threading.Thread(AddressOf foothread)
thread2.Start(textfield1.Text.ToString)

End Sub

按钮#2

Sub button_Click2(byVal sender As Object, ByVal e As Event Args)
If(textfield2.Text = "is cool" And System.Web.HttpContext.Current.Session("myBool") = true) Then
 lable2 = "You're right!"
 else
 lable2 = "???"
 end If  

线程#2

Public Sub thread2(ByVal str1 As String)

If(srt1 = "Stack/Flow") Then
System.Web.HttpContext.Current.Session("myBool") = true 
Else
System.Web.HttpContext.Current.Session("myBool") = false
End If

End Sub

显然这不是一个真实的生产示例,我在线程中运行了一个冗长的查询,它将返回我的会话变量(由于网络流量到该框,所以很长)

这可能吗?有没有更好的办法?这甚至会起作用吗? 多线程应用程序的新手。

谢谢!

1 个答案:

答案 0 :(得分:1)

不,这不起作用。第二个线程没有HTTP上下文,只有运行来处理请求的线程才有HTTP上下文。

您可以为该方法创建一个类以在第二个线程中运行,并将任何输入和输出数据添加为类中的成员:

Public Class Thread2Class

  Public Str1 As String    
  Public MyBool As Boolean

  Public Sub Run()

    If Str1 = "Stack/Flow" Then
      MyBool = True 
    Else
      MyBool = False
    End If

  End Sub

End Class

创建类的实例,设置输入数据,然后启动线程:

Dim thread2 As New Thread2Class
thread2.Str1 = Lable1.Text.ToString
Dim thread2 As New System.Threading.Thread(AddressOf thread2.Run)
thread2.Start()

保留对类的引用,以便在线程完成时可以从成员中读取结果:

Dim result As Boolean = thread2.MyBool