2011-06-24 30 views
1

私は小さな問題があります:私はオブジェクトのログを持っています。このオブジェクトは、書き込み関数が呼び出されたときにイベントを発生させます。現在のアプリケーション・ディスパッチャーでwrite関数を呼び出す必要はありません。 Application.Current.Dispatcher.CheckAccess()がfalseを返した場合c#並行性と順序 - Dispatcher.BeginInvoke

protected void OnLoggingEnqueuedMessage(object sender, EnqueuedMessageEventArgs e) 
{ 
    if (Application.Current.Dispatcher.CheckAccess()) 
     AddLogEntry(e.LogEntry); 
    else 
     Application.Current.Dispatcher.BeginInvoke(new Action(() => { AddLogEntry(e.LogEntry); }), null); 
} 

追加された項目の順序を台無しにすることができますので、次のコードを前提としています。 BeginInvokeでエンキューされた操作は、BeginInvokeが呼び出されたのと同じ順序で実行する必要はありませんが、アイテムを正しい順序で追加するにはどうすればよいですか?あなたが言った

+0

これはそうではありません。 OnLoggingEnqueuedMessageが何らかの順序で呼び出されると仮定しています。スレッド間にはそのような順序はありません。 –

答えて

3

:私は操作がBeginInvokeメソッドをキューに入れていることを理解し

はBeginInvokeメソッド

と同じ順序で実行必要はありませんがdocumentation状態

複数のBeginInvokeメソッドを呼び出した場合同じDispatcherPriorityで作成された場合、呼び出しが行われた順に実行されます。

DispatcherPriorityを指定していないので、コールの優先度は同じになります。

+0

なぜアイテムの順序が乱れているのか分かりません。 – SACO

+0

実行時に、あなたが不正常であることを知っているログエントリを取得していると言っていますか?はいの場合は、正しいディスパッチャを使用していても毎回BeginInvokeを呼び出すようにします。 – wal

+0

あなたの同期呼び出しが、あなたの 'AddLogEntry'メソッドへの非同期(' BeginInvoke')呼び出しを '打つ'可能性があります。 – wal