-1

別のセッションがすでに同じ「トランザクション」をトランザクションで実行しようとしている場合、他のセッションがデータベースを開いたり書き込んだりしないように制限する sema4 ファイルを作成する必要があります。この場合、すでに「進行中」の同様の予約を行います。 .

コードは次のとおりです。

  HttpSessionState ss = HttpContext.Current.Session;
  string sessionID = ss.SessionID;
  DirectoryInfo di = new DirectoryInfo(dataDirectory + "Semaphores");
  string facilityIDExt = requestedFacilityID.ToString().PadLeft(3, '0');
  string sema4File = string.Format("{0}.{1:yyyyMMdd}.{2}", sessionID, RequestedStartDT, facilityIDExt);
  sema4FilePath = Path.Combine(di.FullName, sema4File);
  File.Create(sema4FilePath);

  FileInfo[] fiPaths = di.GetFiles(string.Format("*.{0}", facilityIDExt));
  bool bookingInProgress = true;
  int waitPeriod = 60;
  while (waitPeriod > 0 && bookingInProgress)
  {
    fiPaths = di.GetFiles(string.Format("*.{0}", facilityIDExt));
    bookingInProgress = false;
    foreach (FileInfo item in fiPaths)
      if (item.Name.Contains(string.Format("{0:yyyyMMdd}.{1}", RequestedStartDT, facilityIDExt)) && item.Name != sema4File)
      {
        if (item.LastWriteTime > DateTime.Now.AddMinutes(-1))
        {
          bookingInProgress = true;
          break;
        }
      }
    System.Threading.Thread.Sleep(5000);
    waitPeriod = waitPeriod - 5;
  }

実際の予約がデータベースに記録されるまでに 60 秒もかかりませんが、その間は他の予約リクエストは許可されません。

私が抱えている問題は、次のように呼び出すときです。

        if (File.Exists(sema4FilePath))
         File.Delete(sema4FilePath);

ファイルは「使用中」であるため、iisexpress はファイルを削除しません。iisexpress で「使用中」です。

これはiisでも起こると思います。

iisexpress が sema4 ファイルを開いたままにする理由がわかりません。

sema4 ファイルを削除したい場合、「使用中」の問題を回避するにはどうすればよいですか?

4

1 に答える 1

3

これを行う場合:

File.Create(sema4FilePath);

FileStream が返されます。それを解放するには、それを閉じる必要があります。できれば次のようにラップします。

using (var stream = File.Create(sema4FilePath)) {
  // Do you stuff
}

または、コンテンツを使用しない場合は、直接閉じます。

File.Create(sema4FilePath).Close();
于 2012-12-22T07:24:03.277 に答える