0

Azure ワーカー ロールで WPF を使用して、複数の画像を 1 つの画像に合成し、ディスクに保存しています。エミュレーターではすべて正常に動作しますが、Azure にデプロイすると、スケーリング/サイズ変更された画像が表示されると予想される領域が完全に黒くなります。

コードをコンソール アプリにパッケージ化し、リモート デスクトップを使用して、worker ロールをホストする同じインスタンスにコピーしました。そのアプリは完全に正常に動作します。これは、コードを実行できるようにするために必要なものがすべてバニラの Azure インスタンスに存在することを示しています。

WPF 画像処理に干渉する可能性のある worker ロールのコンテキストで実行する場合の違いは何ですか?

更新 これは特に 3D 変換にのみ影響します。疑似コードでは、次のようなことをしています。

  • メッシュを作成し、テクスチャを適用して、ModelVisual3D
  • を作成Viewport3DVisualし、正投影カメラをセットアップして、ModelVisual3D
  • ビューポートをRenderTargetBitmap
  • を使用して「シーン キャンバス」DrawingContext.DrawImage()に描画します。RenderTargetBitmap

3D が必要ない場合は、画像もスケーリングされて追加さDrawingContext.DrawImage()れます。それはうまくいっています。したがって、この問題はRenderTargetBitmap、3D シーンから を作成または使用することに何らかの形で関連しています。

更新 デスクトップと対話していない場合、WPF は 3D コンテンツをレンダリングしないことが判明しました。エミュレーターは個人のユーザー コンテキストで実行されますが、Azure ではシステム アカウントとして実行されます。ローカル システムとしてログオンする Windows サービスを作成し、同じ手順に従うことで、問題をローカルに再現できます。それを回避することは、おそらく大きな課題になるでしょう。代わりに VM を使用する必要があるかもしれません。

4

2 に答える 2

0

Worker ロールは Full Trust で実行されていますか?

于 2012-07-31T20:53:17.017 に答える
0

エミュレーターでは問題なく動作しますが、WPF コードの ApartmentState を STA に変更してみてください (WPF と STA については、こちらを参照してください: https://stackoverflow.com/a/1293433/384546 )。

public class WorkerRole : RoleEntryPoint
{
    public override void Run()
    {
        Thread thread = new Thread(new ThreadStart(MyWPFCode));
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        while (true)
        {
            Thread.Sleep(10000);
        }
    }

    private void MyWPFCode()
    {
        // WPF code goes here.
    }
}
于 2012-07-31T21:31:50.117 に答える