現在、ローカルマシンでサンドボックスWebサーバーを実行していて、アプリケーションを使用して、テキストファイル(現在は1行)の内容を取得し、メインフォームに表示しています。
Webサーバーが稼働している場合、アプリケーションは正常に実行されます。これは期待どおりです。Webサーバーがダウンすると、アプリケーションは開くことを拒否します。プロセスを生成することは言うまでもありません。
アプリケーションに正しくアプローチしていると思いました。try catch
Webサーバーがダウンした場合に備えて、ブロックを使用しました。コードは次のとおりです。
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>
この線に当たったとき
var RemoteRevision = (new WebClient()).DownloadString(UpdaterURL);
Webサーバーがダウンしている場合、そのコードを実行しているスレッドは、WebClientのタイムアウト値に達するまでブロックし、その後、例外をスローする必要があります。
これをUIスレッドで実行している場合、タイムアウトを待つ間、UIはフリーズします。
あなたが言う時
アプリケーションが実行されないと言うとき。基本的に、VisualStudioを介してデバッグモードで実行されます
UIスレッドで実行されるスタートアップコードでリモートバージョンを確認しているのではないかと強く思います。UIスレッドがブロックされると、アプリケーションが応答しなくなり、実行されていないように見えます。
代わりに、DownloadFileAsync()とasync / awaitパターンを利用してください。
アプリケーションの要件に応じて非同期操作が完了するまで、RemoteRevisionが決定される前にユーザーが機能を操作できないようにするために、メインフォームまたは特定のメニューオプション/ボタンを無効にする必要がある場合があることに注意してください。ウェブサイトがダウンしています。
デフォルトが長すぎてニーズに合わない場合は、WebClientのタイムアウトを変更することもできます。
更新
非同期チェックを使用すると、チェックが行われている間、アプリはWindowsイベントの処理を続行できます。これは、UIがユーザー入力に応答し続けることを意味します。
通常の場合(Webサーバーが使用可能で、リモート呼び出しが高速)、続行してもよいか更新するかがすぐにわかるため、ユーザーは非同期に気付くことはありません。
Webサーバーがダウンしている場合、イベントループが処理されているため、UIはユーザーに応答し続けます。非同期呼び出しが完了するまで、UIのほとんどを無効にすることをお勧めします。そうすれば、Webサーバーが利用できない場合、または呼び出しに予想よりも時間がかかる場合、ユーザーはUIの使用を早期に開始できません。メッセージボックスを表示して(または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;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加