2017-11-01 4 views
2

절대 완료되지 않는 것 같은 C# 비동기 메서드가 있습니다. 델리게이트를 통해 호출되고 양식을 만듭니다. 델리게이트 또는 양식 작성을 제거하면 제대로 작동합니다. 어떤 통찰력이라도 대단히 감사하겠습니다! 코드는 다음과 같이양식을 생성하지만 완료되지 않는 비동기 메서드에 대한 대리자 사용

public delegate Task<bool> TaskDel(); 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     button1.Tag = (TaskDel)taskAsync; 
    } 

    private async void button1_Click(object sender, EventArgs e) 
    { 
     // if I don't use a delegate here there is no problem. 
     await Task.Run(() => ((sender as Button).Tag as TaskDel)()); 
    } 

    public async Task<bool> taskAsync() 
    { 
     await new HttpClient().GetStringAsync(URL); 
     Form form = new Form(); // if I remove this line method works. 
     await new HttpClient().GetStringAsync(URL); 
     return true; // as is, never reaches this line 
    } 
} 

답변

5
  1. 는 비동기 작업의 내부에서, 나는 어떤 UI 동작이 수행되지한다고 생각합니다. 비동기 작업은 일반적으로 데이터에 대한 URL 폴링 (여기에서 수행 한 것처럼) 또는 길이 계산, 데이터 파일의 비 직렬화 등과 같이 리소스를 많이 소비하는 장기 실행 프로세스를위한 것입니다. 호출 양식의 UI 컨트롤과 직접 상호 작용할 수 없습니다 .

  2. 대리인을 사용하지 않아도됩니다. 직접 호출 할 수 있습니다 : I 포함

    private async void button1_Click(Object sender, EventArgs e) 
    { 
        await new HttpClient().GetStringAsync(URL); 
        Form form = new Form(); 
    } 
    
+0

코드는 내가 문제를 각성이 쓸 수있는 가장 간단한이었다. 호출 된 메서드는 컴파일시에 알 수 없으므로 실제로 대리자를 사용해야합니다. 폼 생성과 델리게이트 사용이 왜 실행을 막는 지 알기를 정말로 원합니다. 당신의 생각에 감사드립니다. –

+2

UI 스레드가 아닌 스레드에서 새 Form을 호출 할 수 없기 때문에 Task.Run이 수행합니다. –

+0

아, 나는 그 Task.Run 않는 것을 알지 못했습니다. 나는 그것이 UI 쓰레드에서 돌아가는 것처럼 보일 것이라고 생각했다. 그리고 대의원과 함께 기다릴 필요는 없습니다. 매우 감사합니다. –