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文档,它会指出:

此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

您正在调用实例方法 ( 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 回答