2016-11-03 2 views
1

vb.net 데스크톱 응용 프로그램을 만들고 있습니다. 이 응용 프로그램에는 일부 비동기 함수가 포함되어 있습니다. 사용자가 오른쪽 위 모서리의 빨간색 X를 통해 응용 프로그램을 닫으면 이러한 비동기 함수 중 하나 이상을 실행할 가능성이있는 논리가 있습니다. 문제는 프로그램이 완료되기 전에 종료된다는 것입니다. 나는 "Await"을 사용하여 나의 호출에서 그렇게 할 것이라고 생각했지만 분명히 그렇지 않았다.vb.net 응용 프로그램이 종료되기 전에 비동기 작업 완료 확인

this thread that talks about using ManualResetEvent이 발견되었지만 문제가 콘솔 응용 프로그램의 컨텍스트에 있고 MSDN 설명서의 답변 링크가 단순히 비동기 작업을 사용하는 것이 아니라 스레드를 지정하는 것이기 때문에 모든 것을 이해하는 데 문제가 있습니다. . 어쨌든 그것을 사용의 시도로서, 나는 내 기본 폼이 추가 시도 : (거짓)

공공 resetEvent으로 ManualResetEvent =으로 새로운으로 ManualResetEvent를

그리고 바로 이러한 함수 중 하나를 호출 한 후

,

:
Await activeCount.SerializeAsync(activeCount) 
resetEvent.WaitOne() 

그리고 내 비동기 함수 자체의 끝에

이 작업을 반환하기 전에,이 추가 :이 (견적 호출 포함) 추가

나는 그 권리를 사용하고 있다고 생각하지 않습니다. 프로그램은 어쨌든 완료되기 전에 계속 종료됩니다.

그 전에도 그런 일을위한 가장 좋은 장소는 ApplicationEvents MyApplication_Shutdown에있을 것이라고 생각했지만 그러한 기능이 아직 실행 중인지를 어떻게 알 수 있는지는 잘 모르겠습니다.

그래서이 상황에서 응용 프로그램이 종료되기 전에 모든 비동기 기능이 완료되었는지 확인하는 가장 좋은 방법은 무엇입니까?

감사합니다.


업데이트 한 후 허용 대답은 : 비록 F0r3v3r-A-N00b의 대답은 일

, 나는 내가 어떤 경우에 대화 상자를 사용할 필요가 깨달았다. 대화 상자가 배경 스레드가 아닌 GUI 스레드에 있기 때문에 백그라운드 작업자 내에서 호출 할 수 없습니다. 나는 대화를 먼저 호출하고 배경 작업자와 그 모든 것을 만들려고 물건을 옮겨 보았습니다. 그러나 어떤 이유로 든 작동시키지 못했습니다.

간단히 말하자면, 필자는 단순히 내 함수의 동기 버전을 만들었으므로 '사용자가 프로그램을 종료하고 종료하기 전에 이러한 함수 중 하나를 호출해야한다고 말할 수 있습니다. 동기 버전 호출 대신 '. 그거야. 감사!

답변

1

시도해보십시오. 새 프로젝트를 만듭니다. 양식에 1 개의 레이블과 배경 작업자를 추가하십시오. 이 양식을 양식의 코드 영역에 붙여 넣으십시오.

Public Class Form1 
Dim taskCompleted As Boolean = False 
Dim taskIsrunning As Boolean = False 

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    Threading.Thread.Sleep(5000) 
End Sub 






Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    taskCompleted = True 
    taskIsRunning = False 
    Label1.Text = "Background task completed." 
    Me.Close() 
End Sub 






Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    If taskIsRunning Then 
     e.Cancel = True 
     Exit Sub 
    End If 

    If Not taskCompleted Then 
     taskIsRunning = True 
     Label1.Text = "Starting background task." 
     BackgroundWorker1.RunWorkerAsync() 
     Label1.Text = "Background task is running." 
     e.Cancel = True 
    End If 
End Sub 
End Class 
+0

하하 ... 저는 배경 작업자에 대해 약간의 독서를해야했지만 .... 답장을 보내 주시면 감사하겠습니다. 고맙습니다!! – Andarta