2012-02-13 72 views
0

我開發了一個C#程序,我用它作爲父進程的子進程(使用與C#不同的編程語言編寫,即:Smallworld Magik)。使用C#程序的標準I/O通道進行通信。交互式C#進程通信

其含義是與Smallworld Magik進程中的C#程序進行通信。因此,C#程序應該接收來自Smallworld Magik進程的命令,而Smallworld Magik進程應該接收C#程序的結果/更新。

C#程序最初通過程序的主要方法接收參數。 C#程序將結果/更新寫入輸出通道,Smallworld Magik進程接收並處理它們。

在這裏沒有問題。

該問題位於由C#程序接收來自輸入通道(System.Console.In)的輸入命令。我使用System.Console.ReadLine()方法來獲取輸入命令。調用此方法會阻止進一步的程序執行。

有人對此有「非阻塞」解決方案嗎? 由於我是一名新手C#開發人員,請保持低級:)。

+0

你可以試試這個:http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline – Blorgbeard 2012-02-13 13:18:44

+0

你是什麼意思與「塊」 ?因爲當你使用ReadLine()時,C#程序將等待輸入數據,這是你調用「block」的嗎?或者當您使用ReadLine()讀取數據時,程序停止工作? – 2012-02-13 13:27:48

回答

0

你可以使用線程,既然你說你是一個rooky我會引導您進入教程,因爲線程是棘手的,你應該知道你在做什麼:http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

接下來的事情你做爲ReadLine創建一個單獨的線程並將結果調用回主線程。就像這樣:

void Start() 
{ 
    Thread T = new Thread(ThreadMethod); 
    T.IsBackground = true; 
    T.Start(); 
} 

void ThreadMethod() 
{ 
    string s = System.Console.ReadLine(); 

    this.Invoke(DoStuffInMain, s); 
} 

void DoStuffInMainThread(string s) 
{ 
    // 
} 
+0

'this.Invoke()'只能在Winforms應用程序中使用。 – svick 2012-02-13 16:10:55

+0

謝謝。上述建設效果良好。我沒有使用Invoke()。 – dotnick 2012-02-14 09:48:41