簡體   English   中英

C#,Windows窗體和Application.Run()

[英]C#, Windows Forms, and Application.Run()

當我在窗體上調用Application.Run()時,此命令似乎會暫停程序,直到窗體關閉為止。 是否可以在不停止程序的情況下使用其他命令來創建表單? 謝謝

當您調用Run ,它不會暫停程序。 它將控制權轉移到Windows Forms主消息循環。 您要執行的任何其他代碼都應在單獨的線程中或在事件處理程序(例如Form_Load)中運行。

myForm F = new myForm();
F.Show();

閱讀完您的帖子和評論后,您說您想制作一個IRC應用程序。 我敢肯定有很多方法可以做到這一點,但是我認為這是我會做到的。

我將創建一個在其自己的線程中執行所有IRC內容的庫項目。 收到消息后,讓它觸發一個事件。 然后提供發送消息的方法。

然后,創建引用IRC庫的WinForm項目。 讓表單引用您所創建的類的實例,並注冊所有事件。 然后,只要表單需要發送消息,它就只調用SendMessage方法。 每當觸發事件時,IRC表單都會獲取該事件並正確顯示信息(例如在正確的聊天室選項卡或服務器日志中放置正確的消息)。

通過這種方式,您可以創建一種非常容易地連接到多個服務器的方式,因為這使得IRC可以非常重用。 而且,您還可以按預期的方式運行WinForm,而不必進行破解。

當然,您可以-只需創建一個新線程並在該線程上旋轉表單即可-但是當您開始對UI元素進行多線程處理時,您將面臨很多潛在的麻煩。

您能解釋為什么要繼續處理嗎? 可能最好是松開一個工作線程來執行后台任務,而不要使用主線程。

編輯:根據您的闡述,我認為您可能是從錯誤的方向進行的。

從Windows的角度來看,你的主要形式基本上你的應用程序。 Application.Run調用正在啟動Windows 消息循環 ,該消息循環處理應用程序和操作系統之間的通信處理和調度。 這是程序的“核心循環”,是完成所有UI處理的地方。

通常,除非您有需要不斷執行的任務,否則您不希望弄亂消息循環,如果可能的話,您希望它們占用100%的CPU。 (一個很好的例子是計算機游戲中的模擬和渲染循環;通常,您希望它使用計算機的全部資源來盡可能快地渲染更新。)

在您的情況下,您感興趣的是后台通信處理,它是獨立於UI且需要在應用程序運行期間一直運行的過程。 這是應用程序在其初始化過程中產生的工作線程的最佳選擇。 盡管“純粹的”分離模型可能會建議將此旋轉啟動放入應用程序main()函數中,但我建議您出於所有意圖和目的將主Form_Load事件視為“ main”事件。 您可以創建一個通訊管理器類,並在Load事件期間在后台線程上對其進行初始化,以允許其在后台處理數據並發出事件以使UI響應。

這將顯示表格而不會暫停程序

new Form().Show()

代碼在這里會有所幫助。 通常,當您在program.cs文件中啟動Windows.forms項目時,Visual Studio會生成Application.Run()調用。 您無需在任何地方自己稱呼它。

如果這不是您的問題,則您的表單中可能存在帶有嚴重循環錯誤的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM