2012-03-31 12 views
0

これは私が扱う問題の簡略版です。 私には制御できないスレッドループがあります。 私がメッセージを処理する時間は、ループがスローする時間以上です。Async.AwaitEventとスレッドからの非同期

StartAsyncのマークされたセクションの横にmytypeのものを書き換えることはできません。

このような状況に対処できる指示に私を導くことができますか? たとえば、キュ​​ーにsyncContext.Postのバージョンがありますか? すべてのヘルプは大歓迎

type mytype() = 
    let FinishedEvt = new Event<_>() 
    let FirstEvt  = new Event<_>() 
    member x.First  = FirstEvt.Publish 
    member x.Finished = FinishedEvt.Publish 

    member x.StartAsync() = 

    async { 
    let syncContext = match System.Threading.SynchronizationContext.Current with 
         | null -> new System.Threading.SynchronizationContext() 
         | other -> other 
    do! Async.SwitchToNewThread() 
    //**the code that I can change is here** 
    Thread.Sleep(100) 
    syncContext.Post(SendOrPostCallback(fun _ -> FirstEvt.Trigger ()), null) 
    Thread.Sleep(200) 
    syncContext.Post(SendOrPostCallback(fun _ -> FinishedEvt.Trigger()), null) 
    do! Async.SwitchToContext(syncContext) 
    () 
    } 
    let hopingobject = mytype() 
    let wf1 = lock readLock1 
        (fun() -> 
           async{ printfn "watching" 
             do! Async.AwaitEvent hopingobject.First 
             printfn "first event received" 
             do! Async.AwaitEvent hopingobject.Finished 
             printfn "I never get called"}) 

    hopingobject.StartAsync() |> Async.Start 
    wf1 |> Async.RunSynchronously 
    printfn "the end" 
    Console.ReadKey() |> ignore 

答えて

2

私はあなたが何をしようとして不明確だと、どの部品が不可欠ですが、あなたはリスニングを開始していないので、このビット

async{ printfn "watching" 
     do! Async.AwaitEvent hopingobject.First 
     printfn "first event received" 
     do! Async.AwaitEvent hopingobject.Finished 
     printfn "I never get called"} 

が、私には間違って見えます最初に処理した後に終了するまで、Finishedはすでに終了している可能性があります。おそらくあなたは、より多くの

async{ printfn "watching" 
     let! a = Async.AwaitEvent hopingobject.First |> Async.StartChild 
     let! b = Async.AwaitEvent hopingobject.Finished |> Async.StartChild 
     do! a 
     printfn "first event received" 
     do! b 
     printfn "hurray, I never called"} 

のようなもの(私は、ブラウザでコードを書いています、それが正しいと思っています。)アイデアがあり、最初に両方のリスニングを開始したが、その後まずを待ってから、待つをしたいです完成しました。

+0

確かに。私はおそらくそのように問題に対処することができます。 Asyncモジュールのスレッド関数との非同期継続の組み合わせは非常に強力です。その構造を持つ – nicolas

+0

私はいくつかの重い処理を行うことができます!完了したイベント(イベント発砲とも呼ばれる)がbに記憶されるので、終了イベントを見逃すことはありません。 – nicolas

+0

実際、私は多くの連鎖事象を観察する必要があることに気づいていました。私はAsyncObservableを使用することができましたが、チェーン化の回数は非決定的になります。だから私はいくつかのマルチスレッド同期でメールボックスプロセッサーに行きました。私は新婚旅行のためにそれをお勧めしません。 – nicolas

関連する問題