如何在C#中的DataTable.Rows.Count上创建n个对象基?
下面的所有代码仅用于创建两个进程。而我需要创建一个进程来打开Chrome浏览器并基于如何在C#中的DataTable.Rows.Count上创建n个对象基?,c#,multithreading,linq,datatable,C#,Multithreading,Linq,Datatable,下面的所有代码仅用于创建两个进程。而我需要创建一个进程来打开Chrome浏览器并基于dtUser.Rows.Count运行OpenNRowsInData(user,pwd),因为这是动态的 我不知道为什么OpenNRowsInData(用户,pwd)始终仅获取第一行 我有一个DataTable范围为1-7行 通常,我使用创建两个对象 static myObject[] browser = new myObject[] { new myObject(Browsers.Chro
dtUser.Rows.Count运行OpenNRowsInData(user,pwd)
,因为这是动态的
我不知道为什么OpenNRowsInData(用户,pwd)代码>始终仅获取第一行
我有一个DataTable
范围为1-7行
通常,我使用创建两个对象
static myObject[] browser = new myObject[] {
new myObject(Browsers.Chrome, 0),
new myObject(Browsers.Chrome, 0)
};
Thread t1, t2;
t1 = new Thread(new ThreadStart(AllCase))
{
Name = "Thread1"
};
t1.Start();
t2 = new Thread(new ThreadStart(AllCase))
{
Name = "Thread2"
};
t2.Start();
在类所有情况下:
static int[] stepRun = { 0, 0 };
private void AllCase()
{
int idx = int.Parse(Thread.CurrentThread.Name.Replace("Thread", "")) - 1;
switch (stepRun[idx])
{
case 0:
foreach (DataRow row in dtUser.Rows)
{
user = row["user"].ToString();
pwd = row["pwd"].ToString();
OpenNRowsInData(user, pwd);
}
break;
case 1:
ClickBuy();
break;
}
}
在另一个例子中,在我使用并行处理之前。目前,我不想使用它
Parallel.ForEach(
dtUser.AsEnumerable(),
items => OpenNRowsInData(items["user"].ToString(), items["pwd"].ToString()));
我只想获得user
和pwd
列
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null) throw new ArgumentNullException("source");
if (action == null) throw new ArgumentNullException("action");
foreach (T item in source)
{
action(item);
}
}
尝试使用代码,我尝试在action()
方法中添加一个参数,例如:action(stringuser,stringpwd)
我不知道为什么OpenNRowsInData(用户,pwd);始终只获取第一行
我觉得你的第二个威胁太快了。在第一个可以完成之前,它将执行ClickBuy()代码>因此只能处理第一行
试着一步一步地做
AllCase(0, 0);
AllCase(1, 0);
private void AllCase(int case, int browserNr)
{
switch (case)
{
case 0:
foreach (DataRow row in dtUser.Rows)
{
user = row["user"].ToString();
pwd = row["pwd"].ToString();
OpenNRowsInData(user, pwd, browserNr);
}
break;
case 1:
ClickBuy();
break;
}
}
private void OpenNRowsInData(string username, string password, int browserNr)
{
try
{
browser[browserNr].DeleteAllCookies();
browser[browserNr].GoToUrl(link);
browser[browserNr].waittingID("txtUserName", 15);
browser[browserNr].FindElementById("txtUserName").SendKeys(username);
browser[browserNr].FindElementById("txtpassword").SendKeys(password);
browser[browserNr].FindElementById("btnlogin").Click();
}
}
如果要对两种浏览器都执行此操作,请尝试在阵列上运行循环:
for(int j = 0; j < browser.Length;j++)
{
AllCase(0, j);
AllCase(1, j);
}
然后再打电话
AllCase();
这次它将执行
case 1:
ClickBuy();
break;
在第二次迭代中,它将再次尝试打开
switch (stepRun[idx])
但是这次它会在stepRun
中的0
位置上找到1
。总的来说
在这种情况下,永远不要返回调用OpenNRowsInData
。
这就是为什么你只能得到第一排
编辑2:
如果您想在两种浏览器中同时执行此操作,您可以创建一个例程,执行AllCase
和这两种情况下的例程,您可以在两个单独的线程中运行该例程:
public void doEverything(int browserIndex)
{
AllCase(0, browserIndex);
AllCase(1, browserIndex);
}
然后像这样开始线程:
for(int j = 0; j < browser.Length;j++)
{
int brInd = j;
Thread t= new Thread(()=>doEverything(brInd));
t.Start();
}
for(int j=0;jdoEverything(brInd));
t、 Start();
}
您还可以将整个浏览器对象传递给该方法,并将其进一步传递给OpenNRowsInData
并在那里使用它您可以发布OpenNRowsInData()
的实现吗?您的问题是OpenNRowsInData(用户,pwd)为什么这样做代码>始终仅获取第一行..?=!只是为了澄清一下:在dtUser.Rows
中,您有7行,因此有7个用户,您需要登录其中的每一行。当您在AllCase
中单步执行foreach循环时,是否会产生正确的user
和pwd
值?循环是否在第一次迭代后退出?或者它会给你7倍于同一行吗?让我们来看看。就像你的评论一样,我希望两个浏览器同时执行函数AllCase()
。在C#中,当使用多个线程时,我通常会收到一个进程是成功的所有任务,而剩余的线程将失败。是不是第一个进程在其他线程尝试访问变量之前编辑变量的值?实际上在您的情况下是这样的。它覆盖stepRun[idx]=1代码>。但是您的并行方法并不是处理两种浏览器,而是处理AllCase
You的两种情况。非常感谢@mongzhu。
public void doEverything(int browserIndex)
{
AllCase(0, browserIndex);
AllCase(1, browserIndex);
}
for(int j = 0; j < browser.Length;j++)
{
int brInd = j;
Thread t= new Thread(()=>doEverything(brInd));
t.Start();
}