2014-11-18 2 views
0

일부 코드가 실행되지 않는 이유를 이해하는 데 어려움을 겪고 있습니다.F # handling 작업 취소

type WebSocketListener with 
    member x.AsyncAcceptWebSocket = async { 
    try 
     let! client = Async.AwaitTask <| x.AcceptWebSocketAsync Async.DefaultCancellationToken 
     if(not (isNull client)) then 
      return Some client 
     else 
      return None 
    with 
     | :? System.Threading.Tasks.TaskCanceledException -> 
     | :? AggregateException -> 
      return None 
    } 

내가 취소 토큰이 취소 될 때 AcceptSocketAsyncTaskCanceledException을 던져 알고 :

이 확장 방법을 고려하십시오. C# 응용 프로그램을 체크인했습니다. 아이디어는 None을 반환하는 것입니다.

그러나 결코 발생하지 않습니다. 마지막으로 return None에 중단 점을 넣거나 심지어 if 표현식에 중단 점을 넣으면 취소 토큰이 취소되었을 때 멈추지 않습니다. 그리고 나는 그것이 취소하기 전에 다른 클라이언트가 연결되면 작동하고 중단 점에서 멈추기 때문에 Async.AwaitTask에서 기다리고 있음을 알고 있습니다.

나는 조금 잃어버린 이유는 무엇입니까?

+1

'AggregateException'을 잡으려고 했습니까? – svick

+0

좋은 점이 있지만 시도해 보았지만 여전히 효과가 없었습니다. 나는 AggregateException을 추가하기 위해 질문을 업데이트했다. – vtortola

답변

3

취소는 F # asyncs에서 특별한 경로를 사용합니다 - Async.AwaitTask는 취소 된 작업의 실행을 취소 계속으로 재 라우팅합니다. 당신이 다른 행동을 원한다면 - 항상 수동으로 할 수 있습니다 :

type WebSocketListener with 
    member x.AsyncAcceptWebSocket = async { 
    let! ct = Async.CancellationToken 
    return! Async.FromContinuations(fun (s, e, c) -> 
     x.AcceptWebSocketAsync(ct).ContinueWith(fun (t: System.Threading.Tasks.Task<_>) -> 
      if t.IsFaulted then e t.Exception 
      elif t.IsCanceled then s None // take success path in case of cancellation 
      else 
      match t.Result with 
      | null -> s None 
      | x -> s (Some x) 
     ) 
     |> ignore 
    ) 
    } 
+0

어리 석다. 당신은 Async.AwaitTask가 실행을 취소 연속으로 재 라우팅 할 것이라고 말했습니까? 어떻게 그걸 캐치합니까? – vtortola

+0

컨버전에 대한 어떤 생각이든 Task의 CancelationToken에서 Async의 CancelationToken으로? – neftedollar