0

ファイルのダウンロードに関して、try-catch ステートメントがあります。ファイルがダウンロードされたら、メニュー項目の 1 つを有効にし、1 分後にダウンロードを再試行するように設定されたタイマーをオフにします。

trafficManagementToolStripMenuItem.Enabled = true;私の問題は、メニュー項目が有効になっているにもかかわらず、何らかの理由で私の行が catch ステートメントをアクティブにしていることです。ファイルは正しくダウンロードされ、その行をコメントアウトすると、完全に機能します。しかし、実行するたびに「エラー」メッセージ ボックスが表示され、ダウンロードの完了後にメニュー項目が正しく有効になっているにもかかわらず、タイマーが無効になりません。

何か案は?

try
{
    ////downloads Data

    string address = "http://website.file.txt";
    string filename = "vsd.txt";
    WebClient client = new WebClient();
    client.DownloadFile(address, filename);
    trafficManagementToolStripMenuItem.Enabled = true;
    timer1.Enabled = false;
}
catch
{
    timer1.Enabled = true;
    MessageBox.Show("error", "test");
}
4

2 に答える 2

4

キャッチを次のように変更します

catch (Exception ex) 
{ 
    timer1.Enabled = true; 
    MessageBox.Show("error", ex.Message); 
}

これにより、少なくとも実際のエラーメッセージが表示されます。

UIスレッドで実行しておらず、Control.Invokeを使用する必要があるためだと思います。http ://msdn.microsoft.com/en-us/library/system.windows.forms.controlをご覧ください。 msdnでinvokerequired.aspx

于 2010-01-11T00:12:05.633 に答える
4

例外が何であるかはわかりませんが、バックグラウンド スレッドでダウンロード ルーチンを実行していると思いますが、そうですか? コントロールを作成したスレッド (メイン UI スレッド) からのみコントロールにアクセスできます。バックグラウンド スレッドから ToolStripMenuItem などのコントロールにアクセスすると、例外が発生します。

この場合は、Control.Invoke または Control.BeginInvoke メソッドを使用し.Enabled = trueて、ToolStripMenuItem のスレッドで呼び出しを実行します。これを行うには、コントロールが必要です (残念ながら、ToolStripMenuItem は単なるコンポーネントです)。含まれているフォームへの参照をどこかから取得できると仮定します。これで、次のように記述できます。

Action enableAction = delegate() { trafficManagementToolStripMenuItem.Enabled = true; }
form.BeginInvoke(enableAction);

これにより、enableActionは の正しい UI スレッドで実行されますform

于 2010-01-10T23:44:04.160 に答える