2016-07-21 11 views
2

私の目標は、非同期タスク(この場合はURLの取得)を1秒に1回起動することです。 Asyncタスクが3秒かかると、次のように動作します。F#は毎秒新しい非同期要求を生成します

0sec: Start thread 0 
1sec: Start thread 1 
2sec: Start thread 2 
3sec: Start thread 3 
3sec: Finish thread 0 
4sec: Start thread 4 
4sec: Finish thread 1 

これまでのコードはここまでです。私の問題をより明確にするために、workTimeとAsync.Sleepコードが追加されました。

let FetchUrlAsync (thread: int) (url: string) = 
    async { 
     let req = WebRequest.Create(url) 
     let! resp = req.AsyncGetResponse() 
     use stream = resp.GetResponseStream() 
     use reader = new System.IO.StreamReader(stream) 

     let workTime = System.Random().Next(5000,8000) 
     sprintf "start work %i" thread |> Console.WriteLine 
     do! Async.Sleep workTime 
     sprintf "end work %i (time taken: %i)" thread workTime |> Console.WriteLine 
     return reader.ReadToEnd() 
    } 

Seq.initInfinite(fun i -> FetchUrlAsync i "http://www.google.com" 
          |> Async.StartAsTask 
          |> ignore 
          Thread.Sleep 1000 
       ) 
|> Seq.iter(id) 

問題は、最大2つのスレッドが同時に実行されているようです。なぜこれが起こっているのですか、何が間違っていますか?

また、私はasyncで何かをやっています。

答えて

4

問題はSystem.Net.ServicePointManager.DefaultConnectionLimitです(デフォルトでは2に設定されています)。このような値を高くして値を上げてください。あなたの要求の前に:

+0

私の例では機能するので投票していますが、私は他の回答を期待しています。 [Microsoftサポート](https://support.microsoft.com/en-us/kb/821268)によると、制限は(12 * CPU数)にする必要があります。私は多くのスレッドが並行して実行される可能性を予想しており、この制限によって妨げられたくないのです。 –

+1

@rebornprogrammer:これは正解です... _you should_(おそらく(多分...))がlimit for CpuN * 12はデフォルト値があり、少なくとも何十年もの間、 '2'であったという単純な事実とは関係がありません。 – ildjarn

関連する問題