无法联系服务器,应用程序无法打开

时间:2015-10-12 01:16:19

标签: c# winforms

我目前正在本地计算机上运行沙箱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在调试模式下运行。我已经从Debug交换到Release并构建了解决方案,运行可执行文件的运行不会运行。

我已经浏览了所提供的代码,一切都按预期工作。这对我来说只是一个完全的障碍,为什么应用程序在双击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>

1 个答案:

答案 0 :(得分:4)

当你点击这一行

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

并且Web服务器关闭,执行该代码的线程将阻塞,直到达到WebClient的超时值,然后它应该抛出异常。

如果您在UI线程上运行此操作,则在等待超时时您的UI将冻结。

当你说

  

当我说应用程序没有运行时。它基本上通过Visual Studio

在调试模式下运行

我强烈怀疑您正在检查启动代码中的远程版本,该代码在UI线程上运行。 UI线程被阻止后,应用程序无响应,似乎无法运行。

相反,请使用DownloadFileAsync()和async / await模式。

请注意,您可能需要禁用主窗体或某些菜单选项/按钮,直到异步操作完成,具体取决于应用程序的要求,以防止用户在确定RemoteRevision之前与功能交互,或者你确定该网站已关闭。

如果默认值太长,您也可以change the timeout for WebClient

<强>更新

异步检查将允许您的应用在检查发生时继续处理Windows事件。这意味着UI仍然响应用户输入。

在正常情况下(Web服务器可用,远程调用很快),您将很快知道是否可以继续或者您想要更新,因此用户不会注意到异步。

在Web服务器关闭的情况下,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;