类和线程

时间:2014-01-23 08:51:35

标签: c# multithreading httpwebrequest

我有以下代码:

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。

代码是否是线程安全的?将私有函数放入一个单独的类并为每个线程创建一个类更好吗?

1 个答案:

答案 0 :(得分:2)

如果没有看到GetFirstRequestGetSecondRequest的实际代码,我们无法分辨 - 但事实上您有{{1>类型的实例变量让我持怀疑态度。 StringBuilder本身不是线程安全的,如果你在多个线程中修改单个对象,我怀疑你会得到你想要的结果。

如果您使用StringBuilder构建完整的网址,为什么不在每个方法中创建StringBuilder ?如果您不需要更改对象的任何状态,那么对于线程安全来说,您将走很长的路。

另请注意,您的方法有一个StringBuilder参数,但也可以访问params实例变量(因为params是C#中的关键字,因此需要不同的名称)。你真的需要复制吗?为什么不直接使用方法中的实例变量?

感觉这个类可以线程安全,但几乎可以肯定不是 。您需要将其设计为线程安全的 - 这意味着要么避免任何状态突变,要么使用适当的锁定。 (前者在可能的情况下通常更清洁。)