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

2024-01-11

下面的所有代码仅创建两个进程。虽然我需要创建 n 个进程来打开 Chrome 浏览器并运行OpenNRowsInData(user, pwd)基于dtUser.Rows.Count因为这是动态的。

我不知道为什么OpenNRowsInData(user, 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();

在班上AllCase:

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 and pwd.

尝试使用代码,我尝试添加一个参数action()方法如:action(string user, string 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);
    }
}

Updated:

添加班级OpenNRowsInData(string username, string password):

private void OpenNRowsInData(string username, string password)
{
    int idx = int.Parse(Thread.CurrentThread.Name.Replace("Thread", "")) - 1;
    try
    {
        browser[idx].DeleteAllCookies();
        browser[idx].GoToUrl(link);
        browser[idx].waittingID("txtUserName", 15);
        browser[idx].FindElementById("txtUserName").SendKeys(username);
        browser[idx].FindElementById("txtpassword").SendKeys(password);
        browser[idx].FindElementById("btnlogin").Click();
        stepRun[idx] = 1;
        AllCase();
    }
}

我不知道为什么 OpenNRowsInData(user, 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- 案例the same同时浏览器,因为它们是连续的

EDIT:

编辑后,似乎当您第一次进入循环时OpenNRowsInData在该位置0

stepRun[idx] = 1;

然后再打电话

AllCase();

这次会执行

    case 1:
        ClickBuy();
        break;

在第二次迭代时,它将再次尝试打开

switch (stepRun[idx])

但这一次它会找到一个1在位置上0 in stepRun。对全部 永远不要回到箱子里打电话OpenNRowsInData。 这就是为什么你只得到第一行。

EDIT 2:

如果您想在两个浏览器中同时执行此操作,您可以创建一个例程来执行这两种情况AllCase and this您可以在 2 个单独的线程中运行例程:

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();
}

您还可以将整个浏览器对象传递给该方法,然后将其进一步传递给OpenNRowsInData并在那里使用它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中创建基于 DataTable.Rows.Count 的对象? 的相关文章

  • JQuery、ASCX 和 webmethods 似乎不起作用

    我有一个级联下拉列表 其中 3 个 类型 类别和子类别 首先类型负载 然后选择类型 类别负载以及选择类别 子类别负载 我还有 2 个按钮 添加类别 和 添加子类别 单击这些按钮后 我调用 JQuery 模态表单来添加它们 我在代码后面使用
  • 如何在 ASP.Net Core 6 Web Api 中依赖注入 Microsoft Graph 客户端

    我正在尝试使用 ASP Net Core 6 设置 Web api 以便用户可以到达我的端点 然后我使用特权帐户在 Teams 中执行一些工作 我认为我没有正确连接 DI 部分 因为在向 Teams 发出请求时出现以下错误 MsalUiRe
  • 在 TPL Dataflow 中,是否可以在创建块之后但使用之前更改 DataflowBlockOptions?

    有效果吗 我想推迟设置 ExecutionDataflowBlockOptions SingleProducerConstrained 属性 直到我准备好将网络链接在一起 因为 我想将创建块及其语义与将网络及其语义链接在一起分开 但据我所知
  • 使用 c11 标准和 clang 来使用 strcpy_s

    我正在运行 OS X Sierra 并尝试编译一个使用的 c 程序strcpy s 但是我安装的 clang 编译器使用的是 c99 标准 但是据我读到的 https embeddedgurus com barr code 2017 08
  • 忽略父进程中的信号

    我正在尝试实现一个 shell 程序 我希望 shell 程序忽略 SIG INT ctrl c 但在我的程序中 子进程也会忽略 SIG INT 信号 但它不应该这样做 因为 exec 应该将子进程带到另一个程序 并且该程序默认情况下应该处
  • 不要覆盖 Azure Blob 存储

    我有一种将文件添加到 Azure Blob 存储的方法 问题是我试图指定一个条件 在该条件下它不会覆盖 blob 而只是添加到其中 我正在尝试使用参数访问条件 但是 VS 说这个方法不能采用两个参数 async void archiveNe
  • 改进绩效反思 - 我应该考虑哪些替代方案?

    我需要动态地设置对象上的一堆或属性的值 将其称为传输对象 将在短时间内创建相当数量的此类传输对象并设置其属性 我想避免使用反射 还有其他选择吗 如果是的话 有我可以查看的示例实现吗 Use Delegate CreateDelegate h
  • 从 C# 访问 COM vtable

    C 中有没有办法访问 COM 对象的虚拟方法表以获取函数的地址 经过大量搜索和拼凑不同的部分解决方案后 我弄清楚了如何做到这一点 首先 您需要为您尝试访问的对象定义 COM 组件类 ComImport Guid InterfaceType
  • 在“delete this;”语句期间发生了什么?

    请考虑以下代码 class foo public foo foo void done delete this private int x 以下两个选项中发生了什么 并且有效吗 选项1 void main foo a new foo a gt
  • ASP.NET MVC 数据注释属性 Range 从另一个属性值设置

    您好 我的 Asp net MVc 模型中有以下内容 测试模型 cs public class TestModel public double OpeningAmount get set Required ErrorMessage Requ
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • 使用标准范围连接带有分隔符的字符串范围

    我想使用范围将跨度中包含的四个字节转换为字符串 这是输入和输出的示例 std span
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • 在另一个类中使用一个类对象?

    我正在用 c 制作应用程序 在该应用程序中 我有一个类DataCapture cs 在同一个应用程序中 我有另一个类Listner cs 在 Listner cs 类中 我想使用以下对象DataCapture cs不创建新对象DataCap
  • 通用 lambda 的数量

    可以通过访问非泛型 lambda 的数量来推断其数量operator template
  • 在 Windows 上构建 MLT 框架时出错

    我一直在遵循官方提供的构建指南here http www mltframework org bin view MLT WindowsBuild 我需要 MLT 来创建视频播放器 并且我选择仅安装前 4 个库 如指南中所述 FFmpeg SD
  • 是否有普遍接受的 GMP 替代方案来实现任意精度? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在寻找 BigInt 库的过程中 我发现了这篇文章 Microsoft Windows 上的 C 或
  • 如何使用 XmlSerializer 生成标记前缀

    我想使用 XmlSerializer 生成以下内容

随机推荐