Как запустить код в фоновом режиме, не тратя процессорное время и ресурсы?(Как остановить намеренный бесконечный цикл?)

Я написал преднамеренный бесконечный цикл, чтобы определить, была ли карта обнаружена или удалена на ридере с использованием 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

Так что моя программа не будет заполнена статусом и будет печатать только подключенные или удаленные.

Итак, мои вопросы:

  1. Совпадает ли концепция javaxx smartcardio waitforcardpresent() и waitForCardAbsent() с моей идеей?
  2. Есть ли намного лучший код для определения статуса карты с помощью vb.net/winscard? Если да, то как?
  3. Как я могу остановить этот бесконечный цикл? допустим, пользователь нажал кнопку " Отключить"?
  4. Мой бесконечный цикл плох?

РЕДАКТИРОВАТЬ Бесконечный цикл не очень хорошая идея. Итак, как я могу определить состояние карты в фоновом режиме, не используя ресурсы? или Как правильно использовать 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

0 ответов

Другие вопросы по тегам