C# Parallel.Foreach, New Class and Static voids./strings

本文关键字:Static voids strings and Class Parallel Foreach New | 更新日期: 2023-09-27 18:30:17

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

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

MasterCrawlerClass包含private static voidsprivate static string。 我想我的问题是这个。 由于我在foreach中调用一个新类,因此我在该新类实例中的所有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 设置在并行之前,永远不应该更改。

这是更多的voids和更多的strings. 我还不完全理解线程,所以我正在尝试通过它。

C# Parallel.Foreach, New Class and Static voids./strings

你的 HTMLModelProcess 是线程安全的。 它不会影响任何应用程序状态。

SetNewProxy 方法不是线程安全的。 它更改共享的代理服务器和代理端口的状态。 如果此行为应该在实例范围内发生,则应将其(和相关状态)移动到实例。

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

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

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

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