0

我有一个关于下载文件的 try-catch 语句。下载文件后,我启用其中一个菜单项,然后关闭计时器设置以在一分钟内重试下载。

我的问题是,由于某种原因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

您没有说异常是什么,但我猜您正在后台线程中运行下载例程,对吗?您只能从创建它们的线程访问控件:主 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 回答
4

将您的捕获更改为

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

这至少会给你实际的错误信息。

I'm guessing it's because you are not running in the UI thread and need to use Control.Invoke, take a look at http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx on msdn

于 2010-01-11T00:12:05.633 回答