2015-10-12 74 views
0

我目前我的本地機器&上運行的沙盒Web服務器使用我的申請,我抓住一個文本文件(目前爲單線)的內容,並顯示它返回到主形成。聯繫不上服務器,應用程序無法打開

當Web服務器是活的,應用程序將正常運行,這是符合市場預期。當Web服務器關閉時,應用程序拒絕打開。更不用說產生該進程。

我以爲我是正確地接近應用。如果Web服務器關閉,我使用了try catch塊。代碼如下:

public String UpdaterURL = "http://192.168.0.12/DestinyScreening/Updater/Revision.txt"; 

public int UpdaterVersion(int CurrentVersion) 
     { 
      try 
      { 
       var RemoteRevision = (new WebClient()).DownloadString(UpdaterURL); 
       return Int32.Parse(RemoteRevision); 
      } 
      catch 
      { 
       var Date = DateTime.Now.ToString("yyyy-MM-dd"); 
       var Time = DateTime.Now.ToString("HH:mm"); 
       StreamWriter file = new StreamWriter("ErrorReports\\" + Date + ".txt",true); 
       file.WriteLine(Time + " - Could Not Contact Update Server"); 
       file.Close(); 
       return CurrentVersion; 
      } 
     } 

現在,當我說應用程序不運行。它本質上通過Visual Studio在調試模式下運行..我已經從調試版本交換到發佈版本,並構建瞭解決方案,運行可執行文件的解決方案無法運行。

我已經通過提供的代碼拖網,一切正常。對我來說,這只是一個完整的擋板,至於爲什麼雙擊exe文件時應用程序不生成一個進程?

那麼,總體問題。看起來像是通過Visual Studio上的調試模式正常運行的所有內容。幕後會發生什麼情況會阻止進程產卵?


我無法追蹤這個錯誤,因爲它與發佈版本(雙擊不通過Visual Studio運行的可執行文件)有關。事件查看器顯示以下(這是沒有用的):

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
<System> 
    <Provider Name="Application Error" /> 
    <EventID Qualifiers="0">1000</EventID> 
    <Level>2</Level> 
    <Task>100</Task> 
    <Keywords>0x80000000000000</Keywords> 
    <TimeCreated SystemTime="2015-10-13T22:54:20.000000000Z" /> 
    <EventRecordID>12976</EventRecordID> 
    <Channel>Application</Channel> 
    <Computer>Daryls8</Computer> 
    <Security /> 
    </System> 
    <EventData> 
    <Data>DestinyScreening.exe</Data> 
    <Data>1.0.0.0</Data> 
    <Data>561d8b7c</Data> 
    <Data>KERNELBASE.dll</Data> 
    <Data>10.0.10240.16384</Data> 
    <Data>559f3b2a</Data> 
    <Data>e0434352</Data> 
    <Data>000b3e28</Data> 
    <Data>20bc</Data> 
    <Data>01d1060a17c9bb47</Data> 
    <Data>C:\Users\Daryl\Documents\Visual Studio 2015\Projects\DestinyScreening\DestinyScreening\bin\Release\DestinyScreening.exe</Data> 
    <Data>C:\WINDOWS\SYSTEM32\KERNELBASE.dll</Data> 
    <Data>0ba5af44-c01c-4d4f-a318-855d84d4148e</Data> 
    <Data /> 
    <Data /> 
    </EventData> 
    </Event> 
+0

這是一個控制檯應用程序?的WinForms? –

+0

@DavidTansey對不起,我錯過了這個標籤,這是一個Winform –

+0

它「無法運行」當然很奇怪。也許它執行但快速失敗?你可以添加一些日誌輸出到應用程序?還要注意你的'catch'塊忽略了* actual *異常。這種事情往往會使調試變得困難。 – David

回答

4

當你點擊此行

var RemoteRevision = (new WebClient()).DownloadString(UpdaterURL); 

和Web服務器關閉,執行該代碼的線程將阻塞,直到超時值爲WebClient達成,那麼它應該拋出一個異常。

如果你在你的UI線程運行此,您的用戶界面將凍結在等待超時。

當你說

,當我說的應用程序不運行。它本質上確實通過Visual Studio運行在調試模式下

我強烈懷疑你正在檢查啓動代碼中的遠程版本,它在UI線程上運行。在UI線程被阻塞的情況下,應用程序無響應並且看起來不運行。

而是使用DownloadFileAsync()和異步/等待模式。

請注意,您可能需要禁用主窗體或某些菜單選項/按鈕,直到異步操作完成,具體取決於應用程序的要求,以防止用戶在確定RemoteRevision之前與功能交互,或者您確定該網站已關閉。

如果您的需要默認太長,您也可以change the timeout for WebClient

UPDATE

異步檢查將讓您的應用程序繼續處理窗口事件,而在檢查發生。這意味着UI保持對用戶輸入的響應。

在正常情況下(網絡服務器可用且遠程呼叫速度很快),您將快速知道是繼續還是需要更新,因此用戶不會注意到異步。

在萬維網服務器關閉的情況下,由於正在處理事件循環,用戶界面對用戶保持響應。您可能想要在異步調用完成之前禁用大部分UI。這樣,如果Web服務器不可用或者調用時間比預期長,則用戶無法儘早開始使用UI。您仍然可以顯示MessageBox(或有選擇地啓用部分UI)以提醒用戶需要下載新版本。我認爲你大概可以做到這一點沿線

Form1.Enabled = false; // Whatever your main form is called 
// Make the async call here 
if (isNewVersionAvailable) 
{ 
    MessageBox.Show("Exiting now to update the app version."); 
    // Do whatever you do to update the app, and exit this program 
} 
Form1.Enabled = true; 
+0

對於廣泛的延遲,我很抱歉。我試圖在所有這些最後完成的工作,完全是一個更新程序,它在啓動時檢查新版本。如果有新版本,請檢查遠程文件與本地文件的比較,然後相應下載。我看到的方法是在啓動時調用有問題的功能以提醒用戶更新的版本已準備就緒。然後調用另一個可執行文件來處理下載,在這種情況下異步檢查會導致問題嗎? –

+0

不幸的是,這仍然不起作用。調試版本仍然運行,但發佈版本不運行(即使在清除bin/release文件夾後) –

+0

使用日誌框架(如NLog),並在您點擊處理的早期部分時寫出日誌,例如Main( )首先在第一個/主窗體的構造函數中以及該窗體的OnLoad事件中運行。這可能會讓你知道RELEASE版本在哪裏停滯。 –

相關問題