C#启用菜单项

时间:2010-01-10 23:37:57

标签: c# try-catch menuitem

我在下载文件时有一个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");
}

2 个答案:

答案 0 :(得分:4)

你没有说出异常是什么,但我猜你是在后台线程中运行你的下载例程,是吗?您只能从创建它们的线程访问控件:主UI线程。从后台线程访问诸如ToolStripMenuItem之类的控件将导致异常。

如果是这种情况,请使用Control.Invoke或Control.BeginInvoke方法在ToolStripMenuItem的线程上运行.Enabled = true调用。为此,您需要一个Control(不幸的是,ToolStripMenuItem只是一个Component)。我假设你可以从某个地方获得对包含表格的引用。现在你可以这样写:

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

这会导致enableActionform的正确UI线程上运行。

答案 1 :(得分:4)

将您的捕获更改为

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

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

我猜这是因为你没有在UI线程中运行并且需要使用Control.Invoke,请查看msdn上的http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

相关问题