0

我正在使用 aParallel.ForEach来调用并创建一个新类。

Parallel.ForEach(urlTable.AsEnumerable(),drow =>
        {
            using (var WCC = new MasterCrawlerClass() )
            {
                WCC.MasterCrawlBegin(drow);
            }
        });

MasterCrawlerClass包含private static voidsprivate static string。我想我的问题是这个。既然我在 myforeach中调用一个新类,那么我voids/strings在那个新类实例中的所有 / 都是安全的吗?

class MasterCrawlerClass : IDisposable
{
    public void Dispose()
    {
        GC.Collect();
    }
    public static void SetNewProxy()
    {
        string mysql_Proxyserver_ProxyPort = "select ProxyServer,ProxyPort,ResponseTime FROM proxies.tblproxies where Active = 1 and DateTested >= Date_sub(CurDate(),INTERVAL 2 day) and ResponseTime <= 3 order by Rand() limit 1";
        DataTable proxyDT = new DataTable();
        proxyDT = DTTable(mysql_Proxyserver_ProxyPort, "mysql_Proxyserver_ProxyPort");
        ProxyServer = proxyDT.Rows[0].ItemArray[0].ToString();
        ProxyPort = Convert.ToInt32(proxyDT.Rows[0].ItemArray[1].ToString());
    }

    private static string HTMLModelProcess(string inputString)
    {
        string returnString = string.Empty;
        string ModelString = inputString.Replace("Certified", "").Replace("Used", "").Trim();
        string[] makeModelSplit = ModelString.Split(new char[] { ' ' }, 4);
        returnString = makeModelSplit[2];
        return returnString;

    }
    private static string ProxyServer { get; set; }
    private static int ProxyPort { get; set; }

}

private static DataTable DTTable(string mysqlQuery, string queryName)
    {
        DataTable DTTableTable = new DataTable();
        try
        {
            MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection);
            DataTable DataDTTablesDT = new DataTable();
            DataDTTables.SelectCommand.CommandTimeout = 240000;
            DataDTTables.Fill(DataDTTablesDT);
            DTTableTable = DataDTTablesDT;

        }
        catch (Exception ex)
        {

            GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

        }
        return DTTableTable;
    }

MysqlProcessing.Mysqlstatic.Connection 是在 Parallel 之前设置的,永远不要改变。

这是更多voids一些strings。我还不完全理解线程,所以我正在努力解决它。

4

2 回答 2

1

Your HTMLModelProcess is thread safe. It does not affect any application State.

The SetNewProxy method is not thread safe. It changes the state of the ProxyServer and ProxyPort, which are shared. If this behavior is supposed to happen in an instance scope it (and the related state) should be moved to the instance.

于 2012-04-07T21:31:56.500 回答
1

好吧,您的问题不是很清楚,但是您想知道,AFAIU 是您的 MasterCrawlerClass 类线程安全(即与 Parallel.ForEach() 或其他情况一起使用是否安全,如果它被多个线程访问)只要您在传递给 Parallel.ForEach() 的委托中创建一个新实例(即每个线程的新实例)。

答案 - 如果每个线程都有自己的类实例 - 所有实例(非静态)字段和属性都是安全的,但静态的则不一定。如果你只分配它们一次——当它们被声明或在静态构造函数中并且之后只从它们中读取——它应该没问题。但是,如果您有一个或多个写入静态成员的函数 - 应该同步此访问以避免同时写入或读写。这是有关同步的 MSDN 信息信息 - 看看“锁定”是否适合您的需要。

由于您提供的类只有静态函数和属性-尚不清楚,为什么要在 Parallel.ForEach 中创建一个新实例-所有这些属性都是类级别的,并且会导致内存中的相同对象,如果您尝试这样做会出现问题在不同的线程上启动您的静态函数(非同步并发访问)。

PS请注意,如果您有某个类(引用类型)的静态字段或属性并写入其字段\属性之一 - 它仍然不安全 - 多个线程正在尝试更改同一块内存,可能同时且结果不可预测.

于 2012-04-07T21:46:11.883 回答