我目前正在本地计算机上运行沙箱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>
答案 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;