이 코드 스 니펫이 있습니다.
static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
}
static async Task DoTheThing(int x)
{
await Task.Delay(TimeSpan.FromSeconds(x));
Console.WriteLine(x);
}
나는 그것이 5 번 반복되고 각 루프 후에 다음과 같이 인쇄되는 줄이 있기를 바랍니다.
1
2
3
4
5
그러나 놀랍게도 "done"이 인쇄되고 즉시 종료됩니다. async + await가 Task.Delay를 기다리지 않고 종료 한 것 같습니다.
의미론에 문제가없는 것 같습니다. 그래서 Subscribe 또는 async에 대해 어디에서 잘못되었는지, Rx에서 비동기 작업을 호출하라는 요청을 이행하기 위해 어떻게 수정해야합니까?
감사.
그것은 차단되지 않습니다. 왜냐하면 그것은 비동기 적이기 때문입니다. 코드는 모두 병렬로 실행되는 5 개의 작업을 생성하며 모두 다양한 시간에 완료됩니다.
그러나 그들은 Main
기능을 차단하지 않습니다 . Console.ReadKey()
마지막 줄로를 추가하면 코드가 백그라운드에서 실행되는 것을 볼 수 있습니다. 인쇄됩니다.
static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
Console.ReadKey();
}
그러나 모든 작업이 완료 될 때까지 기다리고 싶다고 가정 해보십시오. 그럼 뭐야?
물론는 .Wait()
있지만 차단입니다. 우리의 모든 작업을 관찰 가능한 것으로 관찰합시다.
우리는 C # 7을 사용할 async Main
것입니다.
static async Task Main(string[] args)
{
await Observable.Range(1, 5)
.Select(x => DoTheThing(x).ToObservable())
.Merge();
Console.WriteLine("done");
}
이것은 당신이 예상했던 것과 똑같이 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다