Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的DataTable.Rows.Count上创建n个对象基?_C#_Multithreading_Linq_Datatable - Fatal编程技术网

如何在C#中的DataTable.Rows.Count上创建n个对象基?

如何在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

下面的所有代码仅用于创建两个进程。而我需要创建一个进程来打开Chrome浏览器并基于
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();
}