可能是死灵线程,但这就是我解决类似问题的方法。就我而言,我必须运行 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 未找到元素”错误。
康斯坦丁。