비동기 기다리는 패턴을 잡으려고합니다.async가 잘못된 실행 순서를 기다린다
private async void asynchWork()
{
// Line 1
Task<string> readTask = asynchAwaitWork();
// Line 2
synchWork();
// Line 3
string result = await readTask;
// Line 4
Debug.WriteLine(result);
Debug.WriteLine("The End");
}
private void synchWork()
{
for (int i = 0; i < 5; i++)
{
Debug.WriteLine("SynchWork For i : " + i);
Thread.Sleep(750);
}
}
private async Task<string> asynchAwaitWork()
{
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
return "finished";
}
내가 1 호선은 3 호선이 완료 문자열을 반환 할 때까지 기다려야 할 것이다 다음, 2 호선과 4 호선을 실행 것으로 예상 : this 예에 따라, 나는 이 작은 프로그램을 구현했습니다. 그러나 출력을 보면 synchWork
메서드는 asynchWork
메서드 다음에 실행됩니다. I 들어
A-SynchWork : I 111
A-SynchWork : 112
A-SynchWork I의 경우 : 113
A-SynchWork I의 경우 : 114
A-SynchWork i : 115
...
I 들어 91,363,210A-SynchWork : I 125
SynchWork 않은 : 0
SynchWork : I 들어 1
SynchWork : I 2
SynchWork 3
SynchWork i의 경우 : 4
완료
414,끝이 나는 asynchWork
방법은 buisy 기다린다는 결과를 3 호선에있을 때 synchWork
방법은 시간에 실행 될 것으로 예상. 예에서 내가 잘못 이해 한 것은 무엇입니까? 또는 결과적으로 Debug.WriteLine
의 출력이 순차적으로 실행되지만 작업의 실제 순서는 내 기대에 따른 것입니까?
편집 : 의견과 답변의 도움으로 내가 배운 :
를 경고를 무시하고 그 의미를 연구하지 마십시오하며
await
키워드가 대기 할 수 있습니다 사용)을 메소드 내에 생성 된
Task
에 의해 실행되는 조작의 결과
편집 2 :
- 그러나 작업이 가지고이 시작된다! 그렇지 않으면 병렬 처리가 없으며 컴파일러는 주 스레드를 통해이를 추적하고 Line 3은 실제로 Line 4에 대한 차단 기능 만 있습니다.
Thread.Sleep(750)
이후
은 시뮬레이션 작업을하고 난 정말이 또한 작동 Delay
필요하지 않습니다 :
private async Task<string> asynchAwaitWork()
{
await Task.Run(()=> {
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
});
return "finished";
}
가 대단히 감사합니다. 나는 것이 asynchAwaitWork 메인 스레드에서 작업을 시작한다는 것입니다 asynchAwaitWork에서 많은 :
'asynchAwaitWork'에 대한 컴파일러 경고가 있어야합니다. 작동하지 않는 이유에 대한 단서를 제공합니다. –
@ScottChamberlain이 누락되었습니다. 따라서 동 기적으로 실행됩니다. 나는이 작은 정보로부터 왜 그 이유를 이해하지 못한다. –
@ 몽주 그런 다음 경고에 대한 조사를하십시오. 거기에 많은 정보가 있습니다. – Servy