上下文:我的SAP GUI中有两个打开的会话,其ID为:
我想在每个会话中运行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中运行多脚本?
抱歉我的英文。 此致
答案 0 :(得分:0)
可能是necro-threading,但这就是我解决类似问题的方法。 在我的情况下,我必须运行N个任务,而不是两个。另请注意,我在c#代码中有脚本步骤,而不是单独的文件。无论如何,这个解决方案应该符合您的要求。
首先,您需要创建现有(初始)会话的多个会话:
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;
}
}
其次,您需要并行执行程序。 假设您有一个需要执行的脚本scr数组:
string[] scr = { "scriptingTask1", " scriptingTask2", " scriptingTask3" };
然后,您将为每个脚本创建并行线程:
Parallel.ForEach<string>(scr
, new ParallelOptions { MaxDegreeOfParallelism = _maxSessions }
, (script) => DoSomeWork(script, sessionList)
);
为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;
}
}
}
第四,确保脚本中的地址(如“/ app / con [0] / ses [0] / wnd [0] / usr / ctxtP_EKORG”)在其中使用相应的会话ID。您可以在这条路径的中间看到它(ses [0])。 如果你在所有脚本中继续引用ses [0],你可能会得到“ID未找到元素”错误。
君士坦丁。