나는 닷넷 프레임 워크 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 구문을 자세히 살펴보면 완전히 연속 된 호출임을 알 수 있습니다.
누군가가이 문제에 대해 더 많은 것을 밝힐 수 있습니까?
예, 순차적으로 만들고 있습니다. Label1.Text가 d2.Start()에 의해 생성 된 값을 표시해야한다고 가정합니다. 완성 된 전화 w 전에 어떻게 그것을 할 수 있습니까? 당신은 주 GUI 스레드에서 그것을 decouple 않았다. –