4

1つの静的クラスと1つのフィールドと2つのメソッドがあります。

 static class MyClass{

       private static HttpClient client = new HttpClient();
       private static string SendRequestToServer(int id)
       {
          Task<HttpResponseMessage> response = client.GetAsync("some string");
          responseTask.ContinueWith(x => PrintResult(x));
          return "some new value";
        }

        private static void Print(Task<HttpResponseMessage> task)
        {
            Task<string> r = task.Result.Content.ReadAsStringAsync();
            r.ContinueWith(resultTask => Console.WriteLine("result is: " + resultTask.Result));
        }
 }

問題は、多くのスレッドがMyClassそのメソッドを使用し始めた場合、それがいくつかの問題を引き起こすかどうかです。

4

2 に答える 2

2

これらのメソッドを通じてアクセスされるすべてのリソースは、スレッドセーフである必要があります。あなたの場合、そうではありません。HttpClientのドキュメントを見ると、次のように記載されています。

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。どのインスタンス メンバーも、スレッド セーフであるとは限りません

スレッド セーフであることが保証されていないインスタンス メソッド ( ) を呼び出しているclient.GetAsyncため、問題が発生する可能性があります。

これを軽減するには、次のことができます。

  • HttpClient呼び出しごとに新しい (ローカル) を作成します。
  • へのアクセスを同期しますclient(例: ロックを使用)。

また、PrintResultスレッドセーフになるかどうかはわかりませんが、スレッドセーフにするConsole.WriteLine必要があります。

于 2012-11-03T13:50:59.723 に答える
0

このようなセットアップでは、予測できない結果が予想される可能性があります。スレッドが同期された方法でデータにアクセスする必要があります。実行が同期された安定した方法で行われるようにするには、ケースでロックステートメントを使用する必要があります。

private static Object locker= new Object();

private static string SendRequestToServer(int id)
{ 
  lock(locker)
  {
    Task<HttpResponseMessage> response = client.GetAsync("some string");
    responseTask.ContinueWith(x => PrintResult(x));
    return "some new value";
  }
}
于 2012-11-03T13:59:33.093 に答える