2014-11-17 10 views
2

use 키워드는 즉시이 범위를 벗어 IDisposable를 결합, 그래서이 재귀 기능을 고려 처분 꼬리 재귀를 사용하는 방법을 찾으십시오. 각각의 재귀 이후에 StreamReader을 처리하겠습니까?F 번호 사용 키워드와 재귀 함수 지금까지 내가 이해로

UPDATE

이 이

토마스 응답이 나에게 당신이 아무것도 기대하지 않습니다 경우에 당신이 실제로 다시 뭔가를 기대하는 경우 고정 방법,하지만 보여? StreamWriter이 예에서와 같이 :

let rec AsyncAcceptMessages(client : WebSocket) = 
    async { 
    let! message = client.AsyncReadMessage 
    if(not(isNull message)) then 
     let s = 
     use reader = new StreamReader(message) 
     reader.ReadToEnd() 
     use writer = new StreamWriter(client.CreateMessageWriter(WebSocketMessageType.Text), Encoding.UTF8) 
     writer.Write s 
     printf "%s" <| s 
    do! AsyncAcceptMessages client 
    } 
+0

업데이트에 대해서는'do'를 사용하여 중첩 된 범위에'IDisposable '을 넣을 수 있습니다. [요지를보세요.] (https://gist.github.com/FunctionalFirst/0348951e82335a5add3d) – Daniel

+0

고마워요. – vtortola

답변

4

것은 당신이 말하고있는 것처럼, StreamReader은 (즉, 결코) 재귀 호출에서 후 실행 반환 처분 될 것이다.

do!은 꼬리 재귀 호출로 처리되지 않으므로 무한 꼬리 순환 루프를 만들려면 return!을 사용해야합니다 (그렇지 않으면 코드에 메모리가 누출 됨) . 당신이 전화를 원한다면

let rec AsyncAcceptMessages(client : WebSocket) = 
    async { 
    let! message = client.AsyncReadMessage 
    let s = 
     use reader = new StreamReader(message) 
     reader.ReadToEnd() 
    printf "%s" <| s 
    return! AsyncAcceptMessages client 
    } 

: 당신이 StreamReader 어떤 비동기 작업을 수행하지 않는 때문에이 경우

, 당신은 그것을 사용하여 쉽게 해결할 수 있습니다, 그래서 당신은 그냥 평범한 로컬 범위를 만들 수 있습니다 예 AsyncReadToEnd이면 다음과 같이 할 수 있습니다 :

let rec AsyncAcceptMessages(client : WebSocket) = 
    async { 
    let! message = client.AsyncReadMessage 
    let! s = 
     async { use reader = new StreamReader(message) 
       return! reader.ReadToEnd() } 
    printf "%s" <| s 
    return! AsyncAcceptMessages client 
    } 
+1

고마워요! 그런데 당신의 책 F # Deep Dives에서 행운을 빈다. 나는 지난 주에 그것을 주문했다. 실망시키지 않을 것이라고 확신한다. – vtortola