2009-02-09 30 views
45

Tôi muốn giao tiếp giữa một quy trình cha và con được viết bằng C#. Nó sẽ là không đồng bộ, sự kiện điều khiển. Tôi không muốn chạy một luồng trong mọi quy trình xử lý giao tiếp rất hiếm.Phương pháp đơn giản nhất của quá trình liên lạc giữa 2 quá trình C# là gì?

Giải pháp tốt nhất cho nó là gì?

+1

tôi đã thực hiện một bài báo trên blog của tôi về một ví dụ thực sự đơn giản của giao tiếp liên quá trình sử dụng Named Pipes trong WCF. [https://dopeydev.com/wcf-interprocess-communication/](https://dopeydev.com/wcf-interprocess-communication/) –

Trả lời

9

tôi sẽ đề nghị sử dụng Windows Communication Foundation:

http://en.wikipedia.org/wiki/Windows_Communication_Foundation

Bạn có thể vượt qua đối tượng qua lại, sử dụng một loạt các giao thức khác nhau. Tôi sẽ đề nghị sử dụng giao thức nhị phân tcp.

+57

... vậy thì cách phức tạp sau đó là gì? – dfasdljkhfaskldjhfasklhf

+4

@BPAndrew: Viết lại phiên bản WCF của riêng bạn? ;) – technophile

+50

Nếu WCF là "phương pháp đơn giản nhất", tôi thực sự muốn khóc: P – kizzx2

13

Nếu quá trình của bạn trong cùng một máy tính, bạn chỉ có thể sử dụng stdio.

Đây là cách sử dụng của tôi, một ScreenShooter trang web:

 var jobProcess = new Process(); 

     jobProcess.StartInfo.FileName = Assembly.GetExecutingAssembly().Location; 
     jobProcess.StartInfo.Arguments = "job"; 

     jobProcess.StartInfo.CreateNoWindow = false; 
     jobProcess.StartInfo.UseShellExecute = false; 

     jobProcess.StartInfo.RedirectStandardInput = true; 
     jobProcess.StartInfo.RedirectStandardOutput = true; 
     jobProcess.StartInfo.RedirectStandardError = true; 

     // Just Console.WriteLine it. 
     jobProcess.ErrorDataReceived += jp_ErrorDataReceived; 

     jobProcess.Start(); 

     jobProcess.BeginErrorReadLine(); 

     try 
     { 
      jobProcess.StandardInput.WriteLine(url); 
      var buf = new byte[int.Parse(jobProcess.StandardOutput.ReadLine())]; 
      jobProcess.StandardOutput.BaseStream.Read(buf, 0, buf.Length); 
      return Deserz<Bitmap>(buf); 
     } 
     finally 
     { 
      if (jobProcess.HasExited == false) 
       jobProcess.Kill(); 
     } 

Detect args on Main

static void Main(string[] args) 
{ 
    if (args.Length == 1 && args[0]=="job") 
    { 
     //because stdout has been used by send back, our logs should put to stderr 
     Log.SetLogOutput(Console.Error); 

     try 
     { 
      var url = Console.ReadLine(); 
      var bmp = new WebPageShooterCr().Shoot(url); 
      var buf = Serz(bmp); 
      Console.WriteLine(buf.Length); 
      System.Threading.Thread.Sleep(100); 
      using (var o = Console.OpenStandardOutput()) 
       o.Write(buf, 0, buf.Length); 
     } 
     catch (Exception ex) 
     { 
      Log.E("Err:" + ex.Message); 
     } 
    } 
    //... 
} 
+3

Tuy nhiên, sẽ không hoạt động nếu quá trình đích cần có GUI, tức là nếu 'ProcessStartInfo.UseShellExecute' là' true'. Trong trường hợp đó, bạn không thể chuyển hướng đầu ra và lỗi chuẩn. –

+0

@GuidoDomenici Bạn thực sự có thể sử dụng nó khi nó có một GUI .... –

+0

@ JayCroghan tôi không nghĩ rằng bạn có thể sử dụng nó khi nó có một GUI. Ít nhất là khi quá trình khách hàng được khởi chạy từ một ứng dụng web. – Balanikas

0

Ngoài ra còn có COM.

Có những kỹ thuật, nhưng tôi muốn nói lợi thế là bạn sẽ có thể gọi các phương thức mà bạn có thể xác định.

MSDN cung cấp hướng dẫn tương tác C# COM. Vui lòng tìm kiếm vì các liên kết này thay đổi.

Để bắt đầu rightaway đi here ...

Các vấn đề liên quan