2011-04-11 62 views
0

情況如下:通過C中的線程調用其他類的事件#

我有一個創建主窗體的類。它使主窗體的創建的對象的靜態成員是這樣的:

public static mainAppWnd; 

和形式在main這樣的代碼的地方創建:

mainAppWnd = new MainAppWnd(); 

現在,我只有保持此應用程序的一個實例一次打開,我通過Mutex來完成。這部分工作正常。當該應用程序的第二個實例打開時,我必須檢查它是否包含一些命令行參數。如果是這樣,我必須將這些命令行參數傳遞給現有的正在運行的實例,並在該正在運行的實例中,我必須打開一個新窗體。這個新表格的開放將在MainAppWnd課程內處理。爲了做到這一點,我使用了管道,並在一個線程中使用Listen。我的線程功能是這樣的:

public static void Listen() 
{ 
    NamedPipeServerStream server = new NamedPipeServerStream("49A252BB-C0FC-4bdb-8CA7-522A3BAE3432"); 
    server.WaitForConnection(); 

    byte[] buffer = new byte[1000]; 
    int bytesread = server.Read(buffer, 0, 1000); 

    string args = Encoding.UTF8.GetString(buffer, 0, bytesread - 1); 
    args.Trim(); 
    string[] arrArgs = args.Split(' '); 
    mainAppWnd.LaunchNewForm(arrArgs.ToList()); //This line crashes because of a UI Call across threads. 
} 

在上面的代碼中,最後一行因線程間的UI調用而崩潰。現在,我明白我必須以某種方式異步地向MainAppWnd傳遞消息,以便這個新表單在其自己的已有上下文中啓動,但我一直未能這樣做。如果它是C++,我會簡單地完成一個::PostMessage(),它會工作,但在C#中最簡單的方法是什麼?

回答

2

假設這是Windows窗體,並mainAppWndForm或類似的東西,你可以用:

Action action =() => mainAppWnd.LaunchNewForm(arrArgs.ToList()); 
mainAppWnd.BeginInvoke(action); 

Control.BeginInvokeControl.Invoke用於與控制相關的UI線程上執行委託你打電話給他們。兩者之間的區別在於BeginInvoke是異步的(火和遺忘),而Invoke阻塞直到委託被執行。

+0

非常感謝。 Invoke和BeginInvoke對我來說很清楚。你能解釋一下'()=> mainAppWnd.LaunchNewForm(arrArgs.ToList());'一點點? – Aamir 2011-04-11 05:40:14

+0

@Aamir:這只是一個lambda表達式 - 一種創建委託的簡單方法,無需編寫完整的單獨方法。 – 2011-04-11 05:59:43

+0

謝謝。我回到你的書然後:) – Aamir 2011-04-11 06:30:41