2017-02-19 4 views
0

これは簡単かもしれませんが、まだ理解できませんでした。オブジェクトのロックを解除する

簡単に言えば:

を、私は私のレポ層における実行時間の長い操作(約8分)を持っています。

public static ReleaseSelection LoadedReleaseSelection = new ReleaseSelection(); 
private static object s_cacheLock = new object(); 

public Long Load(ReleaseSelection releaseSelection) 
{ 
    //check if the release passed in to load is different the one previously loaded 
    if (releaseSelection != LoadedReleaseSelection) 
    { 
     //do something to break the lock(s_cacheLock) 
    } 

    lock (s_cacheLock) 
    { 
     //Reads from TAB files and put them into cache objects.. runs for about 8 mins 

     LoadedReleaseSelection = releaseSelection; 
    } 
} 

サービス層は最終的に、このサービスはAPIエンドポイント私はロード操作の内側lock(s_cacheLock)のキャンセルについて来ることができるか

public async Task<IHttpActionResult> ReleaseLoadPost() 
{ 
    await m_releaseService.LoadAsync(); 
    return Ok(); 
} 

によって呼び出されている

public Task<long> LoadAsync() 
{ 
    ReleaseSelection releaseSelection = //get value from db through another repo call 

    if (releaseSelection == null) 
    { 
     return null; 
    } 

    return Task.Factory.StartNew(() => m_releaseRepository.Load(releaseSelection)); 
} 

非同期ロードを呼び出し、以下の条件が真である(最初のコードブロック)

//check if the release passed in to load is different the one previously loaded 
if (releaseSelection != LoadedReleaseSelection) 
{ 
    //do something to break the lock(s_cacheLock) 
} 

別のスレッドが前のロードが完了しているまで待つ必要がないように?

注:私はキャッシュから読み込まれ、すべてのキャッシュがロードされるまで、実際にそれを行うべきではない他の方法を持っているので、私はlock(m_cacheLock)を必要としています。

+3

タスクでそれをロードし、前のタスクをキャンセルするキャンセルトークンを使用しています。これは約20ミリ秒以内にタスクを停止し、ロックステートメントから飛び出すはずです。 –

+1

「ロック」を「解放」することはできません。他の同期構造を使用することを検討することもできます。 –

+0

@ThomasWeller:自分のコードの変更全体を私の心で理解していないようです。キャンセルトークンを渡すとどのように前のタスクがキャンセルされるかの例を教えてください。 –

答えて

-1

使用Monitor.Enter & Monitor.Exitの代わりに、ロック、例外をキャッチし、ロックを解除してください。

例:8分の負荷プロセスを保護するためにロックを使用する必要はありません

Monitor.Enter(s_cacheLock) 

// do work 

Monitor.Exit(s_cacheLock) 
+3

に関する情報を保持するために、静的として定義され、いくつかのメンバーを持っている(IOCのおかげで)新しいインスタンスを取得します。どのようにしてロック機構を制御できますか? –

+0

@RamiShareef、特定の条件が満たされた場合にロックをキャンセルするように要求しました。その場合は、Monitor.Exitを使用してs_cacheLockのロックを「取り消す」ことができます – Keddy1201

0

、何が必要だけで完全な負荷後の文を設定し、更新のキャッシュをロックしています。また、CancellationTokenを使用してロード処理を取り消し可能にし、ロード処理中に定期的にトークン取り消し状態を確認する必要があります。

関連する問題