2011-02-10 17 views
0

私たちは大規模なe-businessアプリケーションサーバーを持っていますが、私たちはコントロールできません。このアプリケーションサーバーの背後にある企業も、顧客の要件に合わせて変更することはありません。これは、彼らが私たちを競合他社とみなし、顧客がアプリケーションのフロントエンドとしてアプリケーションを使用することを望まないという事実によるものです。.lockファイルの処理

デスクトップアプリケーションは、Webサービスを使用してこのアプリケーションサーバーと通信し、デスクトップからの各ログインはサーバー上のユーザースロットを占有します。アプリケーションサーバーには、ユーザースロットが使用されているかどうかを判断する機能はありません。アプリケーションサーバーとデスクトップクライアントの中間に位置するアプリケーションを開発するのが最善のソリューションです。このアプリケーションはユーザースロットの割り当てと割り当て解除を管理し、問題は解決されます。このソリューションは、お客様がアプリケーションをe-businessアプリケーションサーバーにインストールしたくないため、前述のe-businessサーバーのユーザーサポートを無効にするため、辞退されました。代替サーバーは余分なサーバーになりますが、対処したい。

私たちのデスクトップアプリケーションが共有フォルダへの書き込みアクセス権を持つソリューションを私たちに残します。各デスクトップアプリケーションにはUIDがあり、そのUIDをユーザースロットIDとともに使用し、ファイルUID.UserSlotId.lockedを作成します。これは、接続が行われるたびに、デスクトップアプリケーションがこの共有場所をチェックし、取得されたUserSlotIdを使用しないことを確認する必要があることを意味します。

ロックされたファイルは恐ろしい解決策ですが、顧客はこれを要求しています。彼らは98%の解決策が良い解決策であるという前提の下にあります。だからStackOverflowコミュニティは、そのようなファイルロックシステムを扱うアドバイスの方法で何を提供できますか?

答えて

0

書き込みモードでロックファイルを開き、アプリケーションがスロットを使用している間はロックファイルを開いたままにします。私はこの

FileStream[] currentLock = new FileStream[5]; 
var path = Path.Combine(Path.GetTempPath(), "DbLock"); 
DirectoryInfo di = new DirectoryInfo(path); 
di.Create(); 


TakeFistUnusedLock(currentLock); 
TakeFistUnusedLock(currentLock); 
TakeFistUnusedLock(currentLock); 

currentLock[1].Dispose(); // release lock 2 

TakeFistUnusedLock(currentLock); 

のような出力をテストし

private static void TakeFistUnusedLock(FileStream[] currentLock) 
{ 
    for (int i = 1; i < 5; i++) 
    { 
     try 
     { 
      var fs = File.OpenWrite(Path.Combine(Path.GetTempPath(), "DbLock", i.ToString() + ".lock")); 
      currentLock[i - 1] = fs; 
      Console.WriteLine("Got lock " + i); 
      break; 
     } 
     catch (Exception) { } 
    } 
} 

Got lock 1 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 2 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 3 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 2 

代わりにあなたが唯一のアプリケーションごとにロックを保管currentLock配列を維持しました。開いているFileStreamを保存して、ファイルが書き込みモードで開いたままであることを確認する必要があります。格納されたFileStreamを廃棄するロックを解除するには、ファイルの書き込みロックが解除されます。
このメソッドは、アプリケーションがクラッシュしてもロックが解除されるようにします。

+0

この手順はどのようにして200人の同時ユーザーが行うことができますか?それは問題を引き起こすか? – Mouse

+0

@Mouse。アプリケーションが開いている間に接続を開いたままにし、各キーに新しい接続を作成しないと仮定します。 200人のユーザーの場合、私はロックファイルをランダムな順番でチェックし、おそらく最初にアプリケーションが正常に取得した最後のロックファイルを試そうとします。 –