최근 에 C # 5.0 의 놀라운 비동기 대기 패턴을 충분히 얻을 수없는 것 같습니다 . 여기서 당신은 내 인생되었습니다?
나는 간단한 구문에 완전히 흥분하지만 작은 어려움이 있습니다. 내 문제는 비동기 함수에는 일반 함수와 완전히 다른 선언이 있다는 것입니다. 비동기 함수 만 다른 비동기 함수를 기다릴 수 있기 때문에 오래된 차단 코드를 비동기로 이식하려고 할 때 변환 해야하는 함수의 도미노 효과가 있습니다.
사람들은 이것을 좀비 침입이라고 불렀습니다 . async가 코드에 물린 경우 계속 커지고 커집니다. 포팅 프로세스는 어렵지 않습니다 async
. 선언을 던지고 반환 값을로 감싸는 것입니다 Task<>
. 그러나 오래된 동기 코드를 이식 할 때이 작업을 반복해서 수행하는 것은 성가신 일입니다.
두 함수 유형 (비동기 및 일반 이전 동기화)이 정확히 동일한 구문을 가지고 있다면 훨씬 더 자연 스러울 것 같습니다. 이 경우 포팅에 아무런 노력이 들지 않으며 두 가지 형식간에 어려움없이 전환 할 수 있습니다.
다음 규칙을 따르면 이것이 효과가 있다고 생각합니다.
비동기 함수는
async
더 이상 선언이 필요하지 않습니다. 반환 유형은에 싸일 필요가 없습니다Task<>
. 컴파일러는 컴파일하는 동안 비동기 함수 자체를 식별하고 필요에 따라 Task <> 줄 바꿈을 자동으로 수행합니다.비동기 함수에 대한 더 이상 화재를 잊어 버리지 않습니다. 비동기 함수를 호출하려면 기다려야합니다. 어쨌든 나는 불을 잊어 버리지 않으며 미친 경쟁 조건이나 교착 상태의 모든 예는 항상 그것들을 기반으로하는 것 같습니다. 나는 그들이 우리가 활용하려는 동기식 사고 방식과 너무 혼동되고 "손이 닿지 않는다"고 생각합니다.
불을 잊지 않고 살 수 없다면 특별한 구문이있을 것입니다. 어쨌든, 그것은 내가 이야기하는 간단한 통합 구문의 일부가 아닙니다.
비동기 호출을 나타내는 데 필요한 유일한 키워드는
await
입니다. 기다리는 경우 호출은 비동기입니다. 그렇지 않으면 호출은 일반 오래된 동기입니다 (더 이상 발사하지 않아도됨을 기억하십시오).컴파일러는 더 이상 특별한 선언이 없기 때문에 비동기 함수를 자동으로 식별합니다. 규칙 4를 사용하면이 작업을 매우 간단하게 수행 할 수 있습니다. 함수
await
내부에 호출이 있으면 비동기입니다.
이 작동 할 수 있습니까? 아니면 뭔가 빠졌습니까? 이 통일 된 구문은 훨씬 유동적이고 좀비 침입을 완전히 해결할 수 있습니다.
몇 가지 예 :
// assume this is an async function (has await calls inside)
int CalcRemoteBalanceAsync() { ... }
// assume this is a regular sync function (has no await calls inside)
int CalcRemoteBalance() { ... }
// now let's try all combinations and see what they do:
// this is the common synchronous case - it will block
int b1 = CalcRemoteBalance();
// this is the common asynchronous case - it will not block
int b2 = await CalcRemoteBalanceAsync();
// choosing to call an asynchronous function in a synchronous manner - it will block
// this syntax was used previously for async fire-and-forget, but now it's just synchronous
int b3 = CalcRemoteBalanceAsync();
// strange combination - it will block since it's calling a synchronous function
// it should probably show a compilation warning though
int b4 = await CalcRemoteBalance();
참고 : 이것은 SO에서 흥미로운 관련 토론 의 연속입니다.
await
입니다. 당신은 같은 것을 할 수 있습니다 var task = FooAsync(); Bar(); await task;
. 제안서에서 어떻게해야합니까?
async
입니다. 나는 그의 가장 큰 장점 중 하나라고 생각 async
- await
: 그것은 당신이 쉽게 작성 비동기 작업을 할 수 있다는 것 (뿐 아니라 간단한의 방법 "A, A의 대기를 시작, B, B에 대한 대기 시작"). 그리고 이미이 목적을위한 특별한 구문이 있습니다 await
.