자다. .NET 4.5에서, 당신은 어떤 스레드를 차단하지 않고 코드가 특정 간격 이후에만 실행할 수 있도록 Task.Delay
을 사용할 수 있습니다, 예를 들면 : 첫 번째 WriteLine
는 UI 스레드에서 실행이 경우
Dim port As New SerialPort
...
Public Async Sub SomeButton_Click()
port.WriteLine("First")
Await Task.Delay(500)
port.WriteLine("Second")
Await Task.Delay(300)
port.WriteLine("Third")
End Sub
은 대기가 발생 배경을 500ms (실제 타이머 사용)로 설정하면 원래 스레드 (UI 스레드)에서 실행이 다시 시작되고 두 번째 WriteLine
이 UI 스레드에서도 발생합니다. 또 300ms 기다린 다음 세 번째 WriteLine이 UI 스레드에서도 발생합니다.
Async\Await
조합을 사용하면 BackgroundWorker와 같은 다른 구성 요소를 사용하지 않고도 코드를 매우 명확하게 작성할 수 있습니다. 또한 여러 비동기 호출을 실행하는 것처럼 백그라운드 작업자가 수행 할 수없는 작업을 수행 할 수도 있습니다. 이 경우 복수의 작업자가 필요합니다. 이제는 하나 이상의 문을 작성하십시오.
구문은 이벤트 처리기에만 사용됩니다. 다른 모든 경우에는 Async Function SomeFunction() As Task
을 사용해야합니다.
전체 스레드를 백그라운드 스레드에서 실행하려면 Task.Run
을 사용할 수 있습니다.
Public Async Sub SomeButton_Click()
Task.Run(Async Function()
Await SendAndWait
End Function)
End Sub
public Async Function SendAndWait As Task
_port.WriteLine("First")
Await Task.Delay(500)
_port.WriteLine("Second")
Await Task.Delay(300)
_port.WriteLine("Third")
End Function
Tasks를 사용하여 얻는 진정한 이점은 BackgroundWorker로는 거의 불가능한 여러 비동기 작업을 결합 할 수 있다는 것입니다. 이 경우 비동기 적으로 파일이나 데이터베이스에서 데이터를 읽을 수있는 매우 간단한 코드로, 비동기 시리얼 포트에 보내 추가하여
public Async Function SendAndWait(filePath As String) As Task
Dim line As String
Using reader As New StreamReader(filePath)
For i=0 To 3
line=Await reader.ReadLineAsync()
_port.WriteLine(line)
Await Task.Delay(500)
Next
End Using
End Function
당신은 .NET에서 async/await
키워드를 사용할 수 있습니다 4.0 코드뿐만 아니라 프로젝트에 Microsoft.Bcl.Async 패키지를 추가하십시오.
단순히 작업자 스레드에서이 작업을 수행하지 않는 이유는 무엇입니까? –
좋아, 나는 그 위에있다! 감사! – KRC
왜 .NET의 [SerialPort] (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport%28v=vs.110%29.aspx) 대신 COM 구성 요소를 사용하고 있습니까? ? 또한 응답을받을 수 있도록 기다리고 계십니까? 응답이 500ms 전에 수신 된 경우 두 번째 명령을 먼저 보내면 괜찮습니까? –