vb.net和后台工作人员问题 [英] vb.net and back ground workers issues
问题描述
我是vb.net的新手,并且我一直在研究此应用程序,以在我们的网络中获取远程计算机的信息.在使用后勤人员之前,我的代码工作正常.现在,当它运行时,它会提取信息,但是当我重置字段时,在当前用户,内存和硬盘驱动器大小中,它会清除它,但随后会返回新信息并紧随其后是旧信息.它喜欢它的旧数据,并且不会释放它.我尝试使用dispose命令,甚至每次运行时都创建一个新工作器.任何帮助将是巨大的.
如果我在后台工作人员外部拥有代码,则该代码有效,但是当我这样做时,它将锁定应用程序,直到完成提取信息为止.
抱歉,冗长的代码,但是我想确保您可以看到我在代码方面的明智选择.
I m new to vb.net and i have been working on this application to get remote machines infomration in our network. I had the code working fine till i used a back ground worker. now when it runs it pulls information but in the current user, ram, and harddrive size when i reset the fields it clears it but then comes back with the new information and the old right next to it. Its like its olding data and wont relsease it. I have tried using the dispose command and even having it create a new worker everytime it runs. Any help would be great.
The code works if i have it outside of the background worker but when i do that it locks the application up till its done pulling the information.
Sorry for the long code but i wanted to make sure you could see what i was working with code wise.
Public OSNAME As String
Public SERVICEPACK As String
Public IMAGEDATE As String
Public LASTREBOOT As String
Public PAGEFILE As String
Public DOMAINRESULT As String
Public PCMODEL As String
Public RAMTOTAL As String
Public LOGGEDINUSER As String
Public FREEDRIVESPACE As String
Public EXTDRIVE1 As String
Public EXTDRIVE2 As String
Public EXTDRIVE3 As String
Public IPADDRESS As String
Public MACADDRESS As String
Public DNSRESULT As String
Public TIMEZONE1 As String
Public VIDEORES As String
Private Sub BackgroundWorkerMachineInfo_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerMachineInfo.DoWork
Dim MyObjSearcher As System.Management.ManagementObjectSearcher
Dim MyColl As System.Management.ManagementObjectCollection
Dim MyObj As System.Management.ManagementObject
Dim MyConOptions As New System.Management.ConnectionOptions
With MyConOptions
.Impersonation = System.Management.ImpersonationLevel.Impersonate
' This entry required for Windows XP and newer
.Authentication = System.Management.AuthenticationLevel.Packet
End With
' Connect to WMI namespace
Dim MyMgtScope As System.Management.ManagementScope
MyMgtScope = New System.Management.ManagementScope("\\" & strComputer & "\root\cimv2", MyConOptions)
MyMgtScope.Connect()
If MyMgtScope.IsConnected = False Then
' Error connecting to computer
Exit Sub
End If
'----------------------------------------------------------------------------
'Basic machine INnformation for the left column
'----------------------------------------------------------------------------
Try
' Get data from Win32_OperatingSystem WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_OperatingSystem")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
OSNAME += (MyObj("caption").ToString())
If OSNAME = "Microsoft Windows 7 Enterprise " Then
OSNAME = "Windows 7"
WIN7_UNC_Users.Visibility = ElementVisibility.Visible
UNC_CDRIVE.Visibility = ElementVisibility.Visible
UNC_HostFile.Visibility = ElementVisibility.Visible
UNC_RoamingProfile.Visibility = ElementVisibility.Visible
WIN7_UNC_Zservice.Visibility = ElementVisibility.Visible
UNC_Temp.Visibility = ElementVisibility.Visible
WINXP_UNC_DDRIVE.Visibility = ElementVisibility.Collapsed
WINXP_UNC_Users.Visibility = ElementVisibility.Collapsed
WINXP_UNC_Zservice.Visibility = ElementVisibility.Collapsed
End If
If OSNAME = "Microsoft Windows XP Professional" Then
OSNAME = "Windows XP"
WIN7_UNC_Users.Visibility = ElementVisibility.Collapsed
UNC_CDRIVE.Visibility = ElementVisibility.Visible
UNC_HostFile.Visibility = ElementVisibility.Visible
UNC_RoamingProfile.Visibility = ElementVisibility.Visible
WIN7_UNC_Zservice.Visibility = ElementVisibility.Collapsed
UNC_Temp.Visibility = ElementVisibility.Visible
WINXP_UNC_DDRIVE.Visibility = ElementVisibility.Visible
WINXP_UNC_Users.Visibility = ElementVisibility.Visible
WINXP_UNC_Zservice.Visibility = ElementVisibility.Visible
RDC_Button_Header.Visibility = ElementVisibility.Collapsed
End If
Next
Catch ex As Exception
'An error occured getting data, display what we did get
OSNAME = "UnKnown"
End Try
Try
' Get data from Win32_OperatingSystem WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_OperatingSystem")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
SERVICEPACK = (MyObj("servicepackmajorversion").ToString())
IMAGEDATE = ManagementDateTimeConverter.ToDateTime(CStr(MyObj("InstallDate")))
LASTREBOOT = ManagementDateTimeConverter.ToDateTime(CStr(MyObj("LastBootUpTime")))
Next
Catch ex As Exception
'An error occured getting data, display what we did get
SERVICEPACK = "Unavailable"
IMAGEDATE = "Unavailable"
LASTREBOOT = "Unavailable"
End Try
Try
' Get data from Win32_PageFileUsage WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_PageFileUsage")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
PAGEFILE = (MyObj("AllocatedBaseSize").ToString())
Next
Catch ex As Exception
'An error occured getting data, display what we did get
PAGEFILE = "Unavailable"
End Try
Try
' Get data from Win32_ComputerSystem_WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_ComputerSystem")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
DOMAINRESULT = (MyObj("Domain").ToString())
PCMODEL = (MyObj("Model").ToString())
RAMTOTAL += Reformat_TB_GB_MB(MyObj("TotalPhysicalMemory").ToString())
Next
Catch ex As Exception
'An error occured getting data, display what we did get
DOMAINRESULT = "Unavailable"
PCMODEL = "Unavailable"
RAMTOTAL = "Unavailable"
End Try
Try
' Get data from Win32_ComputerSystem_WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_ComputerSystem")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
LOGGEDINUSER += (MyObj("Username").ToString())
Next
Catch ex As Exception
'An error occured getting data, display what we did get
LOGGEDINUSER = "No One Is Logged In"
End Try
Try
' Get data from Win32_LogicalDisk WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"SELECT * From Win32_LogicalDisk WHERE caption = 'C:'")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
FREEDRIVESPACE = "C:\" & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
Next
Catch ex As Exception
'An error occured getting data, display what we did get
FREEDRIVESPACE = "No Media Connected"
End Try
Try
' Get data from Win32_LogicalDisk WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"SELECT * From Win32_LogicalDisk WHERE caption = 'E:' And DriveType <> 5")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
EXTDRIVE1 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
Next
If EXTDRIVE1 = "" Then
EXTDRIVE1 = "No Media Connected"
End If
Catch ex As Exception
'An error occured getting data, display what we did get
EXTDRIVE1 = "Error"
End Try
Try
' Get data from Win32_LogicalDisk WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"SELECT * From Win32_LogicalDisk WHERE caption = 'F:' And DriveType <> 5")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
EXTDRIVE2 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
Next
If EXTDRIVE2 = "" Then
EXTDRIVE2 = "No Media Connected"
End If
Catch ex As Exception
'An error occured getting data, display what we did get
EXTDRIVE2 = "Error"
End Try
Try
' Get data from Win32_LogicalDisk WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"SELECT * From Win32_LogicalDisk WHERE caption = 'F:' And DriveType <> 5")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
EXTDRIVE3 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
Next
If EXTDRIVE3 = "" Then
EXTDRIVE3 = "No Media Connected"
End If
Catch ex As Exception
'An error occured getting data, display what we did get
EXTDRIVE3 = "Error"
End Try
Try
' Get data from Win32_ComputerSystem_WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_VideoController Where DeviceID = 'VideoController1'")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
Dim VideoResHorizontal = (MyObj("CurrenthorizontalResolution").ToString())
Dim VideoResVertical = (MyObj("CurrentVerticalResolution").ToString())
VIDEORES = VideoResHorizontal + " x " & VideoResVertical
Next
Catch ex As Exception
'An error occured getting data, display what we did get
VIDEORES = "Unavailable"
End Try
Try
' Get Network Info from Win32_NetworkAdapterConfiguration_WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
If Not IsDBNull(MyObj.GetPropertyValue("IPAddress")) Then
Dim IP As Array = MyObj.GetPropertyValue("IPAddress")
For i = 0 To LBound(IP)
IPADDRESS = IP(i)
MACADDRESS = (MyObj("Macaddress").ToString())
DNSRESULT = (MyObj("DnsDomain").ToString())
Next
End If
Next
Catch ex As Exception
'An error occured getting data, display what we did get
IPADDRESS = "Unknown"
MACADDRESS = "Unknown"
DNSRESULT = "Unknown"
End Try
Try
' Get data from Win32_TimeZone WMI
MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
"Select * FROM Win32_TimeZone")
' Execute the query
MyColl = MyObjSearcher.Get
For Each MyObj In MyColl
TIMEZONE1 = (MyObj("DayLightName").ToString())
Next
Catch ex As Exception
'An error occured getting data, display what we did get
TIMEZONE1 = "Unavailable"
End Try
End Sub
Private Sub BackgroundWorkerMachineInfo_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorkerMachineInfo.RunWorkerCompleted
OS_Result_Machine_Table.Text = OSNAME
Service_Pack_Result_Machine_Table.Text = SERVICEPACK
Image_Date_Result_Machine_Table.Text = IMAGEDATE
Last_Reboot_Result_Machine_Table.Text = LASTREBOOT
Pagefile_Size_Result_Machine_Table.Text = PAGEFILE + " MB"
Domain_Result_Machine_Table.Text = DOMAINRESULT
PC_Model_Result_Machine_Table.Text = PCMODEL
RAM_Total_Result_Machine_Table.Text = RAMTOTAL
Loggedin_User_Result_Machine_Table.Text = LOGGEDINUSER
Free_Drive_Space_Result_Machine.Text = FREEDRIVESPACE
Ext1_Drive_Space_Result_Machine.Text = EXTDRIVE1
Ext2_Drive_Space_Result_Machine.Text = EXTDRIVE2
Ext3_Drive_Space_Result_Machine.Text = EXTDRIVE3
VideoRes_Result_Machine_Table.Text = VIDEORES
IP_Address_Result_Machine_Table.Text = IPADDRESS
MAC_Result_Machine_Table.Text = MACADDRESS
DNS_Result_Machine_Table.Text = DNSRESULT
TimeZone_Result_Machine_Table.Text = TIMEZONE1
'----------------------------------------------------------------------
UNC_Links_Header.Enabled = True
Machine_Name_Textbox_Header.Enabled = True
End Sub
Private Sub Stop_Button_Header_Click(sender As System.Object, e As System.EventArgs) Handles Stop_Button_Header.Click
BackgroundWorkerMachineInfo.CancelAsync()
End Sub
推荐答案
我不确定,您可以尝试查看
I''m not sure, you might try looking into
control.checkForIllegalcrossthreadcalls=false
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx [ ^ ]
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx[^]
这篇关于vb.net和后台工作人员问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!