2013-10-16 72 views
3

如果我有這樣的代碼:異步代碼+ Async.RunSynchronously相對於單純的同步碼

let asyncReadToEnd (stream:Stream) = async { 
    // Allocate 4kb buffer for downloading data 
    let buffer = Array.zeroCreate (4 * 1024) 
    use output = new MemoryStream() 
    let reading = ref true 

    while reading.Value do 
    // Download one (at most) 4kb chunk and copy it 
    let! count = stream.AsyncRead(buffer, 0, buffer.Length) 
    output.Write(buffer, 0, count) 
    reading := count > 0 

    // Read all data into a string 
    output.Seek(0L, SeekOrigin.Begin) |> ignore 

    use sr = new StreamReader(output) 
    return sr.ReadToEnd() 
} 

use stream = httpResponse.GetResponseStream() 
asyncReadToEnd stream |> Async.RunSynchronously 

有我獲得了什麼比簡單地做

use stream = httpResponse.GetResponseStream() 
use sr = new StreamReader(stream) 
sr.ReadToEnd() 

在這兩種情況下,我將有當前線程被阻塞,但是在使用第一個版本釋放線程資源方面還有什麼優勢?

+0

這是一個有趣的問題:-)。我認爲你沒有獲得任何東西......只是事實上你現在有一個異步版本的函數,你可以在別的地方使用,如果你真的需要異步做的事情。 –

+0

您的代碼只是['CopyToAsync'](http://msdn.microsoft.com/zh-cn/library/hh159084.aspx)的重寫。 – Daniel

+0

@Daniel,是的,現在,但我需要它,因爲這是針對.NET 4.0 –

回答

0

只要您在每個async工作流程上使用Async.RunSynchronously,您都一無所獲。你需要編寫一個完全異步的程序來利用它。那麼你將可以同時做10,000個。