1

나는 닷넷 프레임 워크 I이 키워드비동기 및 기다리고, 혼란 비트

내가이이를 사용하여 실시간 시나리오를 다음 해결하기 위해 노력하고 4.5

을 기다리고 및 비동기 키워드의 사용을 설명 this 블로그에 refereing하고 devices 디바이스 1과 디바이스 2. 이 장치는 직렬 포트 (RS 232)를 사용하여 내 컴퓨터에 연결됩니다. 이러한 장치에 명령을 보낼 수있는 Windows 응용 프로그램이 있습니다.
이제 처음에는 특정 RS-232 명령을 보내서이 두 장치를 시작해야합니다. 이제이 작업을 동시에 수행하고 이에 따라 UI를 업데이트 할 수 있습니다. 다음은

public class Device1 
{ 
    public async Task<int> Start(int sec) 
    { 
     Console.WriteLine("Device1 started @ : " + DateTime.Now.ToString()); 
     Task t = new Task(() => { Thread.Sleep(sec * 1000); }); 
     t.Start(); 
     await t; 
     Console.WriteLine("Device1 finished @ : " + DateTime.Now.ToString()); 
     return 1; 
    }   
} 

public class Device2 
{ 
    public async Task<int> Start(int sec) 
    { 
     Console.WriteLine("Device2 started @ : " + DateTime.Now.ToString()); 
     Task t = new Task(() => { Thread.Sleep(sec * 1000); }); 
     t.Start(); 
     await t; 
     Console.WriteLine("Device2 finished @ : " + DateTime.Now.ToString()); 
     return 1; 
    }  
} 

private async void button1_Click(object sender, EventArgs e) 
    { 
     Device2 d2= new Device2(); 
     Device1 d1= new Device1(); 

     await d2.Start(10); 
     label1.Text = "d2 Started....";///It takes 10 sec to update this 
     await d1.Start(5);///this line starts executing after 10 secs? Why? 
     label1.Text = "d1 Started..."; 

     MessageBox.Show("I am done...");///Get this message after 15 sec!!! 
    } 

지금 나의 이해가 동시에 실행 await d2.Start(10);await d1.Start(5); 모두이었고, 이에 따라 UI를 업데이트이 시나리오를 해결하는 코드입니다. 하지만 사실이 아닙니다. Console.WriteLine 구문을 자세히 살펴보면 완전히 연속 된 호출임을 알 수 있습니다.
누군가가이 문제에 대해 더 많은 것을 밝힐 수 있습니까?

+1

예, 순차적으로 만들고 있습니다. Label1.Text가 d2.Start()에 의해 생성 된 값을 표시해야한다고 가정합니다. 완성 된 전화 w 전에 어떻게 그것을 할 수 있습니까? 당신은 주 GUI 스레드에서 그것을 decouple 않았다. –

답변

4

async 새내기의 경우 내 async intro을 추천합니다. 그것은 최고의 후속 문서에 대한 링크가 있습니다.

간단히 말해서, 어떤 일이 발생했는지는 사용자가 await 작업입니다. 그러면 해당 작업이 완료 될 때까지 메서드가 일시 중지됩니다. 동시에 실행할 수있게하려면 작업을 변수 (t1, t2)에 저장 한 다음 둘 다 (await Task.WhenAll(t1, t2);)을 기다려야합니다.

P. Task 생성자 또는 Task.Startasync 코드에 사용하지 마십시오. 대신 Task.Run을 사용하십시오.

4

await 키워드는 기다리는 작업 (각각 d2.Start(10)d1.Start(5)의 결과)을 병렬로 실행하지 않습니다. 컴파일러는 스레드를 차단하지 않고 "기다린 작업이 끝난 후에이 메서드의 나머지 부분을 실행하게하십시오"라고 말합니다.

async/await 키워드에 대한 소개를 읽어보십시오. here

관련 문제