2012-04-04 2 views
1

Ich muss eine Liste von Zeichenfolgen als Parameter an eine Konsolenanwendung übergeben (entwickelt mit C#). Die Konsolenanwendung wird mit System.Diagnostics.Process.Start wie gestartet:Übergeben Sie die String-Liste als Parameter an die Konsolenanwendung

string fname = "testDoc"; 
List<string> myList; //initialized elsewhere 

Process console = Process.Start("Client.exe", "-filename:"+fname+ " -list:"+myList); 

Wie kann ich das erreichen?

+0

Nur aus Neugier. Wie viele Daten (Bytelänge) befinden sich in Ihrer Liste? – Steve

+0

Die Liste enthält Dokumente Titel in der Form: "GUID_fileName.pdf". Über die Byte-Länge weiß ich nicht, ich sollte mir das anschauen, da die Titel sich voneinander unterscheiden werden. – Francesco

+1

Ich habe gefragt, weil es eine definitive Grenze für Befehlszeilenargumente Länge – Steve

Antwort

3

Process console = Process.Start("Client.exe", "-filename:" + fname + " -list:" + myList) 

Lauf wird myList.ToString() ausführen und übersetzen:

Client.exe -filename:testDoc -list:System.Collections.Generic.List`1[System.String] 

, die nicht das, was Sie erreichen wollen. Versuchen Sie

Process console = Process.Start("Client.exe", "-filename:" + fname + " -list:" + String.Join(",", myList)) 

oder etwas ähnliches.

UPDATE

Natürlich wollen Sie vielleicht ein paar mehr zivilisierte Methoden der Übergabe von Daten zu diesem Prozess zu berücksichtigen. Gängige Methoden sind:

  • Datenbank
  • Dateisystem (Dateien)
  • WCF

UPDATE

der Kontext, in dem Kommentar geliefert Given, die ich für eine entscheiden würde Vollständig getrennter Windows-Dienst, der auf dem Server läuft (ohne Unterbrechung, nicht aufgerufen) mit der für die Synchronisation verwendeten Datenbank:

  • Datenbank mit Tisch Tasks mit Spalten input data, output data und andere möchten Sie vielleicht (wie einige Daten oder Benutzer-IDs)
  • Webseite Zeilen in dieser Tabelle einfügen als Daten-zu-Verarbeitende-erscheint
  • Fenster wiederholter Dienst (alle x Sekunden) Abfrage der Tabelle nach nicht verarbeiteten Aufgaben und Ausführung der Aufgaben, falls vorhanden; Ergebnisse erhalten in der output data Spalte
  • auf Benutzeranforderung Homepage Anfragen für eine bestimmte Aufgabe gespeichert und zeigt seinen Status, um die Ausgangsdaten zeigt, wenn es sie gibt

Dies ist wesentlich robuster und skaliert wesentlich besser mit wachsenden User-Traffic .Der Dienst selbst würde idealerweise Worker-Threads für separate Aufgaben generieren, um die Vorteile mehrerer Kerne zu nutzen. Wenn eine solche Architektur vorhanden ist, gibt es viele Möglichkeiten, die Leistung zu optimieren und die Aufgaben zu überwachen.

+0

+1 großer Hinweis! - Die Konsolenanwendung würde von einer Webanwendung gestartet werden. Der separate Prozess empfängt die Dokumentennamen und ruft sie ab, wobei ein Webdienst aufgerufen und in eine eindeutige Datei zusammengeführt wird. Von der Webanwendung wird PrintPage.aspx einen Ordner abfragen, in dem die generierte Datei gelöscht wird. In Anbetracht dieses Szenarios (wo sich viele Benutzer entscheiden können, in der gleichen Zeit zu drucken) welche Methode würden Sie vorschlagen? – Francesco

+0

aktualisiert, um zu beantworten –

+0

WCF könnte verwendet werden, um die DB loszuwerden; Die Webseite ruft einen Dienst über WCF auf, der Dienst führt Arbeit aus und gibt das Ergebnis in irgendeiner Weise (wie eine Datei) aus, so dass die Webseite darauf zugreifen kann. WCF würde es Ihnen ermöglichen, diese 2 zu entkoppeln, aber alles würde mehr Arbeit erfordern, um es richtig zu machen. –

0

Vielleicht erstellen Sie die Liste Inhalt von

String.Join(";", myList); 

und in Ihrer Anwendung umgebaut Sie es mit

String.Split(";", receivedParameter); 

Eine weitere Möglichkeit, die Liste Inhalt in eine Datei zu schreiben wäre und als Parameter zur Verfügung stellen nur ein Dateiname, den die Konsolenanwendung einlesen muss.

0
string listValues = String.Join(",", myList.Select(s => String.Format("\"{0}\"", s)).ToArray()); 
Process console = Process.Start("Client.exe", String.Format("-filename:\"{0}\" -list:{1}", fname, listValues));