2009-05-05 11 views
2

私はWritableBitmapを持っています。これは、特にイベントに応じて別のスレッドで更新されます。そのまま、Lock()コマンドはSystem.InvalidOperationExceptionをスロー別スレッドで実行WritableBitmapは別のスレッドでは動作しませんか?

myWritableBitmap.Lock(); 
CopyMemory(myWritableBitmap.BackBuffer, ...); 
myWritableBitmap.AddDirtyRect(...); 
myWritableBitmap.Unlock();

私はこのように同じコードを実行した場合:

this.Dispatcher.Invoke(new VoidDelegate(delegate 
{ 
    //Same code as above... 
}));

をなし、例外がスローされないと、コードが完全に実行されています。 Lock()の目的は、マルチスレッドアクセスを許可するのではないでしょうか?なぜこれが起こっているのか?

答えて

2

多くのWPF描画関数は、STAThreadで実行する必要があります。 2番目のコードは、メインUIスレッドで描画関数を実行します。

編集:WPFのスレッディングに関する詳細はhereです。

+0

ロックはどんな描画をしてはいけません。私はバックバッファにメモリをコピーすることができ、UIスレッドで描画されると仮定します。 –

+0

私は、WPFで見つかった描画機能の多くが、COMベースのコードを使用していることを考えています。これは、STAThreadから呼び出す必要があります。 – HakonB

+0

これは、Apartment = STAの新しいスレッドで上記のコードを生成することができますか? –

関連する問題