0

wkhtmltoimageを使用してマップをラスタライズしようとしています。新しいプロセスを起動し、必要な画像を取得するために必要なコマンドライン引数を渡します。

私は現在、プロセスが開始されたときに非常に長い休止に苦しんでいます。ウィンドウの表示を有効にして、ユーザー入力を必要とするダイアログ関連のアクティビティがあるかどうかを確認しましたが、ありません。プロセスは0%CPUで2〜3分間待機します。のようなコマンドで同じコマンドを実行するには、数秒かかります。

using (Process p = new Process())
{
    ProcessStartInfo info = new ProcessStartInfo(wkhtmlPath, dimensions + EscapeArgument(location) + " -");
    info.UseShellExecute = false;
    info.RedirectStandardOutput = true;
    p.StartInfo = info;
    p.Start();

    byte[] buffer = new byte[32768];
    int read = 0;

    while ((read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
    {

        //... write bytes to the an ouput buffer
    }

}

完了するまでに数分かかります。これは、同じセッションを使用しているコントローラーの1つを指していない場合に正常に機能します。同じセッションを使用する場合、プリントコントローラはwkhtmltoimageからの応答を待機します。この応答は、プリントコントローラがページを取得できるようにロックを解除するのを待機しています。何らかのタイムアウトがこのデッドロックを打破しているに違いありません。どういうわけかセッションロックを安全に解除できますか?

4

1 に答える 1

0

コントローラーのアクションは、MVC3 では既定でユーザー セッションで同期されます。同じセッション トークンを使用してリクエストを再発行すると、デッドロックが発生します。再発行されたリクエストは、発行元のリクエストがセッションのロックを放棄するのを待ちます。エントリ ポイントにセッションをまったく使用しないことでこれを解決しましたが、おそらく最善の解決策ではありません。

これ以上調査しなくても、最善の解決策は、非同期コントローラーについて考え始めることです。私が作成した多くのコントローラー アクションは、ajax を介して非同期的に呼び出されます。このセッション ロック動作は、コントローラーが要求を同期していることを示しています。これは、セッションが使用されていない場合には理想的ではありません。

于 2012-08-27T04:55:51.647 に答える