我有以下代码:
public class Search
{
StringBuilder sb = new StringBuilder();
string[] myparams;
public void Start()
{
//Start search threads
for (int i = 0; i < 50; i++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
string text1 = GetFirstRequest(url, myparams);
string text2 = GetFirstRequest(url, myparams);
}, ct, TaskCreationOptions.LongRunning, TaskScheduler.Default));
}
}
private string GetFirstRequest(string url, string[] myparams)
{
//Use stringbuilder to build the complete url with params
//Use webrequest, response and stream to return the url contents
}
private string GetSecondRequest(string url, string[] myparams)
{
//Similar to GetFirstRequest
}
}
我的主要表格是:
Search search = new Search();
search.Start();
从上面的代码中可以看出,创建了各个线程。但是,每个线程都在Search类中调用相同的私有函数以访问URL。
代码是否是线程安全的?将私有函数放入一个单独的类并为每个线程创建一个类更好吗?
答案 0 :(得分:2)
如果没有看到GetFirstRequest
和GetSecondRequest
的实际代码,我们无法分辨 - 但事实上您有{{1>类型的实例变量让我持怀疑态度。 StringBuilder
本身不是线程安全的,如果你在多个线程中修改单个对象,我怀疑你会得到你想要的结果。
如果您使用StringBuilder
构建完整的网址,为什么不在每个方法中创建StringBuilder
?如果您不需要更改对象的任何状态,那么对于线程安全来说,您将走很长的路。
另请注意,您的方法有一个StringBuilder
参数,但也可以访问params
实例变量(因为params
是C#中的关键字,因此需要不同的名称)。你真的需要复制吗?为什么不直接使用方法中的实例变量?
感觉这个类可以线程安全,但几乎可以肯定不是 。您需要将其设计为线程安全的 - 这意味着要么避免任何状态突变,要么使用适当的锁定。 (前者在可能的情况下通常更清洁。)