비동기 이벤트 핸들러에서 ShowDialog 응답이 지연되는 이유는 무엇입니까?

Nov 16 2020

.NET Framework 4.5Windows Forms 프로젝트에는 비동기 이벤트 처리기가 있습니다. 이벤트 처리기 OpenFileDialog에서 ShowDialog(). 그런 다음 선택한 파일과 비동기 작업을 수행하고 싶습니다. 하지만 이상한 동작이 있습니다. Cancel또는 OK버튼을 사용 하여 대화 상자를 닫은 후 ShowDialog결과 가 반환 될 때까지 9 초 지연되었습니다 . 이번에는 응용 프로그램이 동결됩니다.

여기 내 코드 :

private async void buttonBrowse_Click(object sender, EventArgs e)
{
    DialogResult result = this.openFileDialog.ShowDialog(this);
    if (result != DialogResult.OK) // <- delayed more than 9 seconds after user closes dialog
        return;

    await this.LoadFileAsync(this.openFileDialog.FileName);
}

키워드 async를 제거한 후 코드가 예상대로 작동합니다.

private void buttonBrowse_Click(object sender, EventArgs e)
{
    DialogResult result = this.openFileDialog.ShowDialog(this);
    if (result != DialogResult.OK) // -> no delay here
        return;

    this.LoadFileAsync(this.openFileDialog.FileName); // works, but compiler warning, because missing (await-keyword)
}

누군가이 행동을 설명해 주시겠습니까? 감사.

예, 해결 방법을 알고 있습니다. 대화 상자의 이벤트 처리기를 사용하고 FileOk코드를이 이벤트 처리기로 이동할 수 있습니다 . 하지만 문서화 된 행동에 대해 궁금합니다.

답변

rittergig Nov 19 2020 at 09:33

나는 조금 시도했다. 내가 틀렸다고 생각합니다. async키워드에 의존하지 않습니다 .

Windows Forms 버그 인 것 같습니다. 참고 항목 : OpenFileDialog.ShowDialog () 호출시 Windows Forms GUI가 중단됨

내가 설정 한 경우 ShowHelp속성을합니다 true. 그런 다음 지체없이 작동합니다. 그러나 다른 파일 열기 대화 상자 (최소한 최신 Windows 10에서는)입니다.

this.openFileDialog.ShowHelp = true;