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
確かに。私はおそらくそのように問題に対処することができます。 Asyncモジュールのスレッド関数との非同期継続の組み合わせは非常に強力です。その構造を持つ – nicolas
私はいくつかの重い処理を行うことができます!完了したイベント(イベント発砲とも呼ばれる)がbに記憶されるので、終了イベントを見逃すことはありません。 – nicolas
実際、私は多くの連鎖事象を観察する必要があることに気づいていました。私はAsyncObservableを使用することができましたが、チェーン化の回数は非決定的になります。だから私はいくつかのマルチスレッド同期でメールボックスプロセッサーに行きました。私は新婚旅行のためにそれをお勧めしません。 – nicolas