これは簡単かもしれませんが、まだ理解できませんでした。オブジェクトのロックを解除する
簡単に言えば:
を、私は私のレポ層における実行時間の長い操作(約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)
を必要としています。
タスクでそれをロードし、前のタスクをキャンセルするキャンセルトークンを使用しています。これは約20ミリ秒以内にタスクを停止し、ロックステートメントから飛び出すはずです。 –
「ロック」を「解放」することはできません。他の同期構造を使用することを検討することもできます。 –
@ThomasWeller:自分のコードの変更全体を私の心で理解していないようです。キャンセルトークンを渡すとどのように前のタスクがキャンセルされるかの例を教えてください。 –