2016-12-30 13 views
5

MailboxProcessorがメッセージを受け取ったときにデータベースに行を追加するコードがあります。 fsiで実行すると正しく動作しますが、exeファイルにコンパイルするとハングします。次のようにスクリプトは次のとおりです。F#プログラムはfsiで正常に動作しますが、EXEとしてハングします

exeファイルにコンパイル
#r "../packages/Newtonsoft.Json/lib/net40/Newtonsoft.Json.dll" 
#r "../packages/SQLProvider/lib/FSharp.Data.SqlProvider.dll" 

open Newtonsoft.Json 
open FSharp.Data.Sql 
open System 

let [<Literal>] ResolutionPath = __SOURCE_DIRECTORY__ + "/../build/" 
let [<Literal>] ConnectionString = "Data Source=" + __SOURCE_DIRECTORY__ + @"/test.db;Version=3" 

// test.db is initialized as follows: 
// 
// BEGIN TRANSACTION; 
// CREATE TABLE "Events" (
//  `id`INTEGER PRIMARY KEY AUTOINCREMENT, 
//  `timestamp` DATETIME NOT NULL 
// ); 
// COMMIT; 

type Sql = SqlDataProvider< 
      ConnectionString = ConnectionString, 
      DatabaseVendor = Common.DatabaseProviderTypes.SQLITE, 
      ResolutionPath = ResolutionPath, 
      IndividualsAmount = 1000, 
      UseOptionTypes = true > 
let ctx = Sql.GetDataContext() 

let agent = MailboxProcessor.Start(fun (inbox:MailboxProcessor<String>) -> 
    let rec loop() = 
     async { 
      let! msg = inbox.Receive() 
      match msg with 
      | _ -> 
       let row = ctx.Main.Events.Create() 
       row.Timestamp <- DateTime.Now 
       printfn "Submitting" 
       ctx.SubmitUpdates() 
       printfn "Submitted" 
      return! loop() 
     } 
    loop() 
) 

agent.Post "Hello" 

、印刷された「提出」、しかし、それがハングアップします。試してみると、完全なコードはgithubにありますhere

+3

私はそれがなぜ掛かっているのか正確にはわかりませんが、あなたが 'ctx'を悪用していると言えます。データコンテキストは、「短命」、すなわち自己完結型操作のたびに新たに作成され、直ちに破棄されると考えられています。しかし、プロセス全体に単一のコンテキストを使用しています。 –

答えて

5

MailboxProcessorがメールボックスを処理する前にメインスレッドが終了していたようです。 FSIは長寿命なので、そこでは起こっていなかった。

[<EntryPoint>] 
let main argv = 
    agent.Post "Hello" 
    agent.Post "Hello again" 
    let waitLoop = async { 
     while agent.CurrentQueueLength > 0 do 
      printfn "Sleeping" 
      do! Async.Sleep 1000 
     } 
    Async.RunSynchronously waitLoop 
    0 

[<EntryPoint>] 
let main argv = 
    agent.Post "Hello" 
    agent.Post "Hello again" 
    0 

を、私は意図していたとして、今のコードが実行さ:私が変更されました。

関連する問題