2017-02-13 3 views
-3

ロック/スリープを使用してAPIに要求を進めるシンプルなコードを書きましたが、なぜ動作しないのかわかりません。ロック/スリープが動作しない

public class RequestHandler 
{ 
    private static readonly Object Lock = new Object(); 
    public static WebResponse Request(string url) 
    { 
     lock(Lock) 
     { 
      WebRequest request = HttpWebRequest.Create(url); 
      WebResponse response = request.GetResponse(); 
      Thread.Sleep(5000); 
      return response; 
     } 
    } 
} 

複数のスレッドがこのメソッドを同時に呼び出します。

5秒ごとに呼び出しがありますが、時には 2つのスレッドが同時にそこに入り、2つの要求が1秒未満の間隔で実行されます。

EDIT:
要求(簡易)を発射するコード

public void Process(string url) 
{ 
    // do some treatments 
    var response = RequestHandler.Request(url); 
} 

public void Main() 
{ 
    var urls = new List<string>(); 
    // add urls to the list... 
    Parallel.ForEach(urls , Process); 
} 
+3

はあなたがスレッドを使用してリクエストメソッドを使用しているどのようにコードを投稿することができますか? –

+0

"Thread"は以前に初期化された変数か "System.Threading.Thread.CurrentThread"ですか?ロック変数の宣言から "readonly"を削除してみてください。 – Graffito

+0

スレッドの@Graffitoインスタンスには 'Sleep'メソッドがありません。 – Cologler

答えて

0

あなたの問題は、オブジェクト対ロックである:あなたはので、インスタンス生成静的クラスで、ロックオブジェクトを使用することはできませんオブジェクトが存在するために、インスタンスを必要とする - 私はこれは泥と同じくらい明確で実現するので、私は説明します:

// do some treatments 
RequestHandler handler = new RequestHandler(); 
var response = handler.Request(url); 

あなたのRequestHandlerをインスタンス化され、かつロックオブジェクトをすることができ、この方法は監視される。それ以外の場合は、ロックするオブジェクトがありません。私はこのことができます:)願ってい

EDIT:

ます。また、インスタンスであるためにあなたの要求方法を変更する必要が

public WebResponse Request(string url) 
+0

是非質問や答えを下書きしてください。OPがあなたに質問をより良くする方法を学べるようにコメントを投稿すれば、助けようとしている人も学ぶことができます。単に下向きの矢印をクリックしても誰も助けてくれません。 – trapsuutjies

+0

うん、私は同意する...とにかくあなたの答えはうまくいかなかったが、お試しいただきありがとうございます –

+0

あなたのメインメソッドもいくつかのスレッドで実行されていますか?それ以外の場合は、私のコードが動作します。私が提案した3つの変更をすべて行ったことを再度確認してください。 Mainメソッドが複数のスレッド(またはプロセス)で実行されている場合は、解決するのがもっと難しいジレンマです。 – trapsuutjies