我在下载文件时有一个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");
}
答案 0 :(得分:4)
你没有说出异常是什么,但我猜你是在后台线程中运行你的下载例程,是吗?您只能从创建它们的线程访问控件:主UI线程。从后台线程访问诸如ToolStripMenuItem之类的控件将导致异常。
如果是这种情况,请使用Control.Invoke或Control.BeginInvoke方法在ToolStripMenuItem的线程上运行.Enabled = true
调用。为此,您需要一个Control(不幸的是,ToolStripMenuItem只是一个Component)。我假设你可以从某个地方获得对包含表格的引用。现在你可以这样写:
Action enableAction = delegate() { trafficManagementToolStripMenuItem.Enabled = true; }
form.BeginInvoke(enableAction);
这会导致enableAction
在form
的正确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