Как запустить код в фоновом режиме, не тратя процессорное время и ресурсы?(Как остановить намеренный бесконечный цикл?)
Я написал преднамеренный бесконечный цикл, чтобы определить, была ли карта обнаружена или удалена на ридере с использованием vb.net. Потому что я не знаю, есть ли что-то вроде waitForCardPresent в winscard.
Таким образом, концепция заключается в том, что после нажатия кнопки Connect запускается цикл ifinite для проверки карты.
Так что мой код в backgroundworker выглядит так:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Do
Dim ret As Integer
Dim rs As WinscardFun.SCARDREADER_STATE
rs.dwEventState = Nothing
rs.rgbAtr = Nothing
rs.pvUserData = Nothing
rs.cbAtr = Nothing
rs.szReader = rdr
rs.dwCurrentState = &H0
ret = WinscardFun.SCardGetStatusChange(hcontext, -1, rs, 1)
If ret = 0 And rs.cbAtr > 0 And rs.rgbAtr IsNot Nothing Then
ReDim atr(rs.cbAtr)
Array.Copy(rs.rgbAtr, atr, rs.cbAtr)
If status = "Connected" Then
'Do nothing
Else
test = "Connected"
Console.Write(test)
End If
Else
If test = "Remove" Then
'Do nothing
Else
status = "Remove"
Console.Write(test)
End If
End If
Loop
End Sub
Этот код объясняет, что программа будет постоянно проверять состояние карты в фоновом режиме. Я написал:
If status = "Connected" Then
'Do nothing
Else
test = "Connected"
Console.Write(test)
End If
Else
If test = "Remove" Then
'Do nothing
Else
status = "Removed"
Console.Write(test)
End If
End If
Так что моя программа не будет заполнена статусом и будет печатать только подключенные или удаленные.
Итак, мои вопросы:
- Совпадает ли концепция javaxx smartcardio waitforcardpresent() и waitForCardAbsent() с моей идеей?
- Есть ли намного лучший код для определения статуса карты с помощью vb.net/winscard? Если да, то как?
- Как я могу остановить этот бесконечный цикл? допустим, пользователь нажал кнопку " Отключить"?
- Мой бесконечный цикл плох?
РЕДАКТИРОВАТЬ Бесконечный цикл не очень хорошая идея. Итак, как я могу определить состояние карты в фоновом режиме, не используя ресурсы? или Как правильно использовать scardgetstatuschange?
Я думал, что -1 в
WinscardFun.SCardGetStatusChange(hcontext, -1, rs, 1)
означает, что это будет бесконечный цикл на основе
''' <summary>
''' The SCardGetStatusChange function blocks execution until the current availability of the cards in a specific set of readers changes.
''' </summary>
''' <param name="hContext">A handle that identifies the resource manager context. The resource manager context is set by a previous call to the SCardEstablishContext function.</param>
''' <param name="TimeOut">The maximum amount of time, in milliseconds, to wait for an action. A value of zero causes the function to return immediately. A value of INFINITE causes this function never to time out.</param>
''' <param name="ReaderState">
''' An array of SCARD_READERSTATE structures that specify the readers to watch, and that receives the result.
''' To be notified of the arrival of a new smart card reader, set the szReader member of a SCARD_READERSTATE structure to "\\\\?PnP?\\Notification", and set all of the other members of that structure to zero.
''' Important Each member of each structure in this array must be initialized to zero and then set to specific values as necessary. If this is not done, the function will fail in situations that involve remote card readers.
''' </param>
''' <param name="ReaderCount">The number of elements in the rgReaderStates array.</param>
''' <returns></returns>
<DllImport("winscard.dll", EntryPoint:="SCardGetStatusChangeA", CharSet:=CharSet.Ansi)> _
Public Shared Function SCardGetStatusChange(ByVal hContext As IntPtr, ByVal TimeOut As Integer, ByRef ReaderState As SCARD_READERSTATE, ByVal ReaderCount As Integer) As Integer
End Function