スレッドセーフは、私が書いた単純なアプリやライブラリが通常メインスレッドでのみ実行されるため、または以前に心配する必要があったクラスのプロパティやフィールドを直接変更しないため、私が心配している側面ではありません。
WebClient
ただし、リモートサーバーから非同期でデータをダウンロードするために使用している個人的なプロジェクトに取り組み始めました。Queue<Uri>
データをダウンロードするための一連のURIの事前に作成されたキューを含む があります。
したがって、次のスニペットを検討してください(これは私の実際のコードではありませんが、私が望んでいることは私の質問を示しています:
private WebClient webClient = new WebClient();
private Queue<Uri> requestQueue = new Queue<Uri>();
public Boolean DownloadNextASync()
{
if (webClient.IsBusy)
return false;
if (requestQueue.Count == 0)
return false
var uri = requestQueue.Dequeue();
webClient.DownloadDataASync(uri);
return true;
}
私が正しく理解している場合、このメソッドはスレッドセーフではありません(このオブジェクトのこの特定のインスタンスが複数のスレッドに認識されていると仮定します)。私の推論は、チェックとメソッド呼び出しwebClient
の間の時間にビジーになる可能性があります。また、チェックと次のアイテムがデキューされる までの間に空になる可能性があります。IsBusy
DownloadDataASync()
requestQueue
Count
私の質問は、このタイプの状況を処理してスレッドセーフにするための最良の方法は何ですか?
これは、この特定のメソッドについて、これが実際に問題を引き起こすには非常に不便なタイミングが必要であることに気付いたので、より抽象的な質問です。その場合をカバーするためにtry-catch
、両方の部分が適切であるため、メソッドを適切にラップすることができます。例外をスローします。しかし、別のオプションはありますか?lock
ここでステートメントが適用されますか?