我有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
及其方法,是否会导致一些问题?
答案 0 :(得分:2)
通过这些方法访问的所有资源都需要是线程安全的。在你的情况下,他们不是。如果您查看HttpClient文档,请说明:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。 不保证所有实例成员都是线程安全的。
您正在调用实例方法(client.GetAsync
),但不保证该方法是线程安全的,因此可能会给您带来问题。
为了缓解这种情况,你可以:
HttpClient
。client
的访问权限(例如,使用锁定)。另外,我不能告诉你PrintResult
是否是线程安全的,但Console.WriteLine
应该是线程安全的。
答案 1 :(得分:0)
您可能希望通过此类设置获得不可预测的结果。您需要让线程以同步的方式访问数据。在您的情况下需要使用lock语句来确保执行在同步和稳定的方式。
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";
}
}