2

私は現在ウェブサイトを開発していますが、適切な解決策を見つけるのに苦労しています。

別のブラウザーから自分のサイトを開き、同時に AJAX 呼び出しを行おうとすると、両方のブラウザーが要求を処理しているため、エラーが発生します。

サーバーが現在 AJAX 呼び出しを実行しているかどうかを検出し、最初の要求が完了するまで待ってから 2 番目の要求を実行する方法はありますか?

これは、異なるブラウザーを使用して同時に ajax リクエストを作成しようとしたときのコードです

using (StreamWriter sw = new StreamWriter(hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString() + ".hhp", false))
            {

                sw.WriteLine("[OPTIONS]");
                sw.WriteLine("Compatibility=1.1 or later");
                sw.WriteLine("Compiled file=" + hhpPath + "\\Unpublished\\"+ Name +".chm");  //the file to be converted
                sw.WriteLine("Contents file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhc"); //TOC file
                sw.WriteLine("Default topic=" + "Installing the Prototype Terminal.html");
                sw.WriteLine("Display compile progress=no");
                sw.WriteLine("Index file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhk"); //index file
                sw.WriteLine("Title=none");
                sw.WriteLine("\r\n[FILES]");
                sw.WriteLine("none");
            }

エラーは、ファイルが現在使用中であることを示しています。

4

3 に答える 3

1

以下のようにファイルにコンテンツを書き込んでいる間、ファイルをロックする必要があります

lock (lockObject) 
{
  var sw = new StreamWriter(fs);
  sw.Write('text');
  sw.Flush();
  sw.Close();
}

スレッドの同期については、このリンクを確認してください。

于 2013-10-21T04:37:59.373 に答える
1

ファイルが使用中の場合、ajaxリクエストをクライアント側で直接検出することはできません。そのアイテムの周りに try キャッチを配置して、-1 (ファイルがロックされている) ステータス 1 (成功) または 0 (その他のエラー) を返すことができます。

または、次の関数を試して、コードの前にチェックして、ファイルが使用中かどうかを確認し、関連するステータスを ajax 呼び出しに返します。

  protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;
        Boolean status = false;
        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            status = false ;
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            status = true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return status;
    }
于 2013-10-21T04:32:56.427 に答える