关于下载文件,我有一个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");
}发布于 2010-01-11 07:44:04
你没有说异常是什么,但我猜你是在后台线程中运行你的下载例程,对吗?您只能从创建控件的线程访问控件:主UI线程。从后台线程访问诸如ToolStripMenuItem之类的控件将导致异常。
如果是这种情况,请使用Control.Invoke或Control.BeginInvoke方法在ToolStripMenuItem的线程上运行.Enabled = true调用。为此,您需要一个控件(不幸的是,ToolStripMenuItem只是一个组件)。我假设您可以从某个地方获得对包含表单的引用。现在你可以这样写了:
Action enableAction = delegate() { trafficManagementToolStripMenuItem.Enabled = true; }
form.BeginInvoke(enableAction);这会使enableAction在form的正确UI线程上运行。
发布于 2010-01-11 08:12:06
把你的目标改成
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
https://stackoverflow.com/questions/2039129
复制相似问题