2017-05-05 144 views
0

語境:我在SAP GUI兩次公開會議有以下ID:運行在SAP GUI多個腳本

  • /應用/ CON [0]/SES [0]
  • /應用/精讀[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中運行多腳本?

對不起,我的英語。 Regards

回答

0

可能是necro-threading,但這是我如何解決類似的問題。 在我的情況下,我不得不運行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; 
    } 

} 
  • 其次,您需要並行程序的執行。 讓我們假設你有腳本的數組SCR,你需要執行:

    string[] scr = { "scriptingTask1", " scriptingTask2", " scriptingTask3" }; 
    
  • 然後你會爲每個腳本創建並行線程:

     Parallel.ForEach<string>(scr 
           , new ParallelOptions { MaxDegreeOfParallelism = _maxSessions } 
           , (script) => DoSomeWork(script, sessionList) 
           ); 
    
  • ,你考上一個拉姆達將分配的腳本任務到會話,並將其發佈

    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」錯誤。

  • 君士坦丁。