0

上下文:我的 SAP GUI 中有两个打开的会话,ID 如下:

  • /app/con[0]/ses[0]
  • /app/con[0]/ses[1]

我想在每个会话中运行 1 个脚本(vbs),这是我的代码:

foreach (GuiSession s in _dicSap[tmpDKey].get_lstSapSession())
{
    if (!s.Busy)
    {
        Process p = Process.Start(scriptName, s.Id); //s.Id=/app/con[0]/ses[0]
        await Task.Delay(5000);
        break;
    }
}

问题:我的脚本已正确执行,但它们是一一执行的。我想同时运行这些脚本。我不明白,因为我没有使用.WaitForExit()。

是我的代码错误还是无法在 C# 的 SAP GUI 中运行多脚本?

对不起我的英语不好。问候

4

1 回答 1

0

可能是死灵线程,但这就是我解决类似问题的方法。就我而言,我必须运行 N 个任务,而不是两个。另请注意,我在 c# 代码中有脚本步骤,而不是在单独的文件中。无论如何,这个解决方案应该符合您的要求。

  1. 首先,您需要创建现有(初始)会话的多个会话:

    for (int i = 0; i < numOfSessions - 1 ; i++)
        {
            SapSession.CreateSession();
        }
    

所有这些会话都将放在一个列表(sessionList)中。我使用自定义 sessionDetails 类,因为我需要存储 ID 和活动信息:

for (int i = 0; i < _maxSessions; i++)
 {
     sessionDetail sd = new sessionDetail((GuiSession)sapConnection.Sessions.Item(i), false, i);
     sessionList.Add(sd);
 }


class sessionDetail
{
    public GuiSession sapSession { get; }
    public bool isUsed { get; set; }
    public int sessionId { get; set; }

    public sessionDetail(GuiSession SapSession, bool IsUsed, int SessionId)
    {
        sapSession = SapSession;
        isUsed = IsUsed;
        sessionId = SessionId;
    }

}
  1. 其次,您需要并行执行程序。假设您有一组需要执行的脚本 scr:

        string[] scr = { "scriptingTask1", " scriptingTask2", " scriptingTask3" };
    

然后,您将为每个脚本创建并行线程:

        Parallel.ForEach<string>(scr
                 , new ParallelOptions { MaxDegreeOfParallelism = _maxSessions }
                 , (script) => DoSomeWork(script, sessionList)
                 );
  1. 您为 lambda 传递的方法会将脚本任务分配给会话并启动它们

    private void DoSomeWork(string scrptTask, List<sessionDetail> _sessionList)
    {
        sessionDetail _sessionToUse;
        foreach (sessionDetail s in _sessionList)
        {
            if (!s.isUsed)
            {
                _sessionToUse = s;
                s.isUsed = true;
    
                //// Do your stuff here
    
                s.isUsed = false;
                break;
            }
        }
    }
    
  2. 第四,确保脚本中的地址(如“/app/con[0]/ses[0]/wnd[0]/usr/ctxtP_EKORG”)使用相应的会话ID。你可以在中间看到它此路径 (ses[0])。如果您在所有脚本中继续引用 ses[0],您可能会收到“ID 未找到元素”错误。

康斯坦丁。

于 2017-09-29T18:35:58.920 回答