2016-11-01 13 views
4

나는 F #을 배우려고 노력 중이며 일부 C# 코드를 F #으로 변환하는 과정에 있습니다.C# async/F #에 대한 메소드를 기다리고 있습니까?

public async Task<Foo> GetFooAsync(byte[] content) 
{ 
    using (var stream = new MemoryStream(content)) 
    { 
     return await bar.GetFooAsync(stream); 
    } 
} 
bar 일부 개인 필드

GetFooAsyncTask<Foo>를 반환

나는 다음과 같은 C#을 방법이 있습니다.

어떻게하면 F #으로 변환됩니까? Task 반환

member public this.GetFooAsync (content : byte[]) = 
    use stream = new MemoryStream(content) 
    this.bar.GetFooAsync(stream) 

을 : 여기

내가 현재 가지고있는 것입니다. F 번호에

+0

여기서'stream' 변수 또는'content' 매개 변수의 요점은 무엇입니까? C#과 F # 코드 둘 다에서, 그들은 당신의 기능 어디에서나 사용되는 것처럼 보이지 않습니다. – rmunn

+0

Doh! 내 샘플은 실제 코드의 단순화 된 버전이지만 실수로 스트림 사용을 생략했습니다. 질문을 업데이트했습니다. –

+0

@ OJRaqueño 비동기 호출의 결과를 사용하지 않으려면'await'이 필요하지 않습니다. 그냥'return bar.GetFooAsync (stream);과 같은 작업 자체를 반환하십시오.이 경우 처리 할 메모리 스트림에서 작업을 수행하고 있기 때문에이 코드를 사용해야합니다 - 이유는 무엇입니까? –

답변

3

는 비동기은 Task의 정확한 아날로그하지 않은 async 계산 빌더로 표현되어 있지만, 일반적으로 하나의 장소에서 사용할 수 있습니다

member public this.GetFooAsync (content : byte[]) = 
    async { 
     use stream = new MemoryStream(content) 
     return! this.bar.GetFooAsync(stream) |> Async.AwaitTask 
    } 
    |> Async.StartAsTask 
+0

답변 해 주셔서 감사합니다. 'return' 라인에서 오류가 발생했습니다 :'이 표현식은 Async <'a> 유형을 가질 것으로 예상되었지만 여기에는 작업 '유형이 있습니다. 'GetFooAsync' 메쏘드는'Task '를 반환합니다. –

+0

실제로. 'return! '다음의 표현식은 그 자체가'Async <'t>'이어야하지만'GetFooAsync'는'Task <'t>'를 반환합니다. 세부 사항을 놓쳤습니다. Async.AwaitTask를 사용하여 변환 할 코드를 업데이트했습니다. –

+0

알았어. 또한 호출 코드를 변경하는 방법을 공유 할 수 있습니까? 호출 코드는이 메소드의 반환 값이'Async <'t>'대신'Task <'t>'유형이 될 것으로 기대하고있다. –

2

당신이 async/await을 변환하는 경우 - F 번호에 대한 집중적 인 C# 코드, 그것은 때문에 차이의 성가신 얻을 수 있습니다 F #의 asyncTask 당신은 항상 당신이 FSha을 사용할 수 있다는 방지하기 위해 Async.AwaitTask

전화를해야한다는 사실 rpx 라이브러리에는 task 계산식이 있습니다.

let tplAsyncMethod p = Task.Run (fun _ -> string p) 

// awaiting TPL method inside async computation expression 
let asyncResult = async { 
        let! value1 = tplAsyncMethod 1 |> Async.AwaitTask 
        let! value2 = tplAsyncMethod 2 |> Async.AwaitTask 
        return value1 + value2 
       } 

// The same logic using task computation expression 
open FSharpx.Task 
let taskResult = task { 
        let! value1 = tplAsyncMethod 1 
        let! value2 = tplAsyncMethod 2 
        return value1 + value2 
       } 

asyncResult의 결과 Async<string>이고 taskResult의 결과 Task<string>이다.

+0

팁 주셔서 감사합니다; 그 도서관을 확실히 확인할거야. –