2011-10-28 7 views
0

サーバマシンにテキストファイルが存在し、常に更新されています(約1秒で約1秒)。私のWebページでは、MVC内のjQueryを使用してこのファイルをライブで表示するようにしたいと思います。jQuery(MVC)を使用してファイルシステムのテキストファイルを非同期的にストリーミングする

私はjQuery timerが既に動作していますが、ファイルが表示されていません。私の計画は、5秒ごとにController Actionをロードし、このアクションでFilePathResultを返すjQueryを取得することでした。

スクリプト:

$(function() { 
     var streamer = $("div.wrapper div.streamer"); 
     //=== 

     var active = false; 
     $(document).ready(function() { 

      $(".uncontrolled-interval p", streamer).everyTime(1000, function() { 
       $(this).load("/Home/Stream"); 
      }); 
     }); 
    }); 

ビュー:

<div class="wrapper"> 
    <div class="streamer"> 
     <div id="uncontrolled-interval" style=" height:420px; width:1200px; background-color:Black; color:White; overflow: auto; " ></div> 
    </div> 
</div> 

コントローラ:

Public Function Stream() As ActionResult 
    Return File(ConfigurationManager.AppSettings.Item("LiveStreamPath"), "text/plain") 
End Function 

LiveStreamPathは、テキストファイルへのパスが含まれています。私は代わりにアクションでStreamReaderを作成することを考えていました。このファイルをストリームに流すためには、どのような実装を使用できますか?

答えて

0

POLLとPUSHの2つのアプローチがあります。

あなたが採用したのは、AJAX要求を送信し、内容が変更されていなくても結果を表示することによって、クライアントが定期的にサーバーをポーリングすることです。このシナリオでは、共有リソースがあります。この共有リソースはファイルです。このリソースは、異なるスレッド/プロセスによって同時にアクセスされる可能性があります。ファイルの問題は、1つのスレッドがファイルに書き込んでいる間に(ファイルが5秒ごとに更新されているとします)、別のスレッドがそのスレッドから読み込もうとすると、失敗するか、ファイルから不整合なデータを取得する可能性が非常に高くなります。したがって、ポーリングの手法を採用する場合は、このファイルへのアクセスを適切に同期させる必要があります。ファイルに書き込んでいる別のスレッドであるか、別のプロセスであるかによって、これを達成するためのさまざまなテクニックがあるかもしれません。たとえば、別のスレッドの場合は、Monitor.Enter(C#lockに相当)を使用できます。共有リソースのクロスプロセス同期では、Mutexを使用できます。

第2のアプローチはPUSHアプローチです。このモデルでは、ファイルが更新されたときにクライアントに通知を送信するサーバです。クライアントがAJAXリクエストをたくさん使ってサーバーをハッカーしていないので、はるかに最適化されています。これを実装するさまざまな手法があります。たとえば、HTML5ではWebSocketを使用できます。 Microsoftはこのシナリオを非常に簡単な方法で可能にするSignalrと呼ばれる偉大なプラットフォームに取り組んでいます。

0

小さなテストアプリのjqueryでこれをやっただけです(バックグラウンドをテストして、フォアグラウンドを美しくするのではなく、プロセスを開始する1つのリクエストを送信してモニタを起動するリンクをクリックして呼び出されます)。バックグラウンドで

function startJob() { 
    $.get('<%=ResolveUrl("~/Background/StartJob.ashx") %>'); 
    setTimeout('updateStatus()', 500); 
} 
function updateStatus() { 
    $("#results").load('<%=ResolveUrl("~/Background/ReadStatus.ashx") %>'); 
    setTimeout('updateStatus()', 500); 
} 

何のロックを開いていない間、あなたは、単にこれを行うにはFile.ReadAllText()を使用することができます。

あなたはせずにファイルに追加されますされ、などFile.AppendText()/AppendBytes()を使用することができます書き込むため私はストリームライターを使ったことはめったにありません。 FileShareのすべてのパラメータと、これは一般にWebアプリにとって十分です。

はい、常に更新して大量のデータを使用すると、一貫性のない読み込みが発生する可能性があります。それが問題でない場合(例えば、重い処理がない場合、UIはあまり気にしません)、それをそのままにしておきます。UIが気にしている場合は、ReaderWriterLockSlimを使用します。

リソースへのアクセスを管理するために使用されるロックを表し、複数のスレッドが書き込み用に排他アクセスを許可します。

関連する問題