2010-08-14 60 views
0

我有一個項目在沒有傳遞適當的命令行參數時顯示一個UI。這是一個用於動態更新桌面牆紙的簡單實用程序。當它完成更新時,我致電在Application.Run完成之前處理.NET應用程序

this.Dispose(); 

但是,如果傳遞命令行參數,則會導致問題。實際上,表單在用戶顯示Dispose方法之前最終會調用。結果是一個令人討厭的錯誤,表示程序無法正常運行,即使它按照我的意願做了。

我可以尊重的是,我不是非常合乎邏輯,但我不知道解決方案的另一種方法。有另一種方法可以在應用程序加載之前乾淨地調用Dispose()方法而不會導致錯誤?

附加信息:以上

是evidentially不明確,我爲此道歉。我的計劃是從Program.cs的文件開始:

Application.Run(new MainForm()); 

在構造函數中我檢查命令行參數存在,如果是這樣調用一個叫SilentRun程序。這個私有方法檢查參數是否有效,如果是,則將它們傳遞給提交名爲BrandSystem()的操作的方法。

BrandSystem後()完成後,其工作,最後一條語句是

this.Dispose(); 

因爲有沒有別的實際做應用。如果沒有傳遞命令參數並且用戶使用GUI來應用更改,則會調用相同的方法。本質上,一旦更新壁紙的過程完成,我希望應用程序自行終止。

命令行參數的原因是這種排序實用程序可以添加到安裝包並在後臺以靜默方式運行。我的安裝過程不具備更新壁紙的本地功能,這對我來說是一個雙鳥一體的工具。

當程序在命令行模式下運行並在實際加載所有內容之前調用Dispose時,會出現此問題。即使他們證明我的邏輯完全不健全,我仍然樂於接受建議。

+0

非常不清楚,你的代碼片段沒用。無論如何,當你的程序終止時,爲什麼要放棄任何東西? – 2010-08-14 19:53:49

+0

@Hans Passant - 請參閱更新以獲得澄清。謝謝你指出我太模糊了。 – Jeff 2010-08-14 21:56:43

+0

您剛剛添加了* any *程序中存在的代碼片段。 – 2010-08-14 23:05:44

回答

1

我看不到你所有的代碼,但是有沒有什麼理由讓你的程序在無聲模式下運行時必須調用Application.Run?如果你消除了啓動GUI,那麼你不應該擔心處置它。

這裏是我怎麼可能做到這一點:

// In main method 

if (runningInSilentMode) 
{ 
    // Run the app in silent mode 
    // Do core behavior based on arguments, don't call Application.Run 
} 
else 
{ 
    // Run the app in interactive mode 
    // Do core behavior based on the user's input 
    Application.Run(new MainForm()); 
} 

當然,這是假定你的核心程序邏輯沒有與GUI集成。如果它與你的GUI集成在一起,你將需要做一些重構來分離它。

+0

我想你打破了這裏的代碼!當然,答案是將SilentInstall()方法移到一個沒有用GUI保存的外部類中,並將命令行參數檢查移到Program.cs文件中。謝謝。我知道這將成爲一個打耳光的時刻,而且,在這裏,我正在把自己拍在額頭上。謝謝! – Jeff 2010-08-15 20:38:25

1

爲什麼不直接標記它,等到它已經加載,然後退出應用程序? Dispose是用於特定任務的:從非託管對象中回收資源。

+0

你是什麼意思? – Jeff 2010-08-14 21:57:03

+0

設置一個布爾值,存儲一個會話。做一些事情來「存儲」應用程序需要關閉的事實,然後使用這些信息來決定是否在適當的時候關閉應用程序。 – Rushyo 2010-08-15 11:17:27

相關問題