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 voids
和private 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
. 我还不完全理解线程,所以我正在尝试通过它。
你的 HTMLModelProcess 是线程安全的。 它不会影响任何应用程序状态。
SetNewProxy 方法不是线程安全的。 它更改共享的代理服务器和代理端口的状态。 如果此行为应该在实例范围内发生,则应将其(和相关状态)移动到实例。
好吧,你的问题不是很清楚,但是AFAIU,你想知道,你的类MasterCrawlerClass线程是否安全(即与Parallel.ForEach()或其他情况一起使用,如果它被多个线程访问)只要你在传递给Parallel.ForEach()的委托中创建一个新实例(即每个线程的新实例)。
答案 - 如果每个线程都有自己的类实例 - 所有实例(非静态)字段和属性都是安全的,但静态字段和属性不一定是安全的。如果您只分配它们一次 - 当它们被声明或在静态构造函数中并且之后只从它们读取时 - 它应该没问题。但是,如果您有一个或多个写入静态成员的函数 - 则应同步此访问以避免同时写入或读写。下面是有关同步的 MSDN 信息信息 - 查看"锁定"是否适合您的需求。
由于您提供的类只有静态函数和属性 - 不清楚为什么在 Parallel.ForEach 中创建新实例 - 所有这些属性都是类级的,将导致内存中的相同对象,如果您尝试在不同的线程上启动静态函数(不同步并发访问),就会出现问题。
附言请注意,如果您有一个静态字段或某个类(引用类型)的属性并写入其字段''属性之一 - 它仍然不安全 - 多个线程正在尝试更改同一块内存,可能同时且结果不可预测。