【问题标题】:C# enabling menu itemC# 启用菜单项
【发布时间】:2012-05-02 20:14:28
【问题描述】:

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

【问题讨论】:

  • 这段代码是否在主 GUI 线程以外的线程上运行?
  • 或许先看看异常是什么?
  • 是的,它在后台。奇怪的是,它第二次运行(在定时器重新启动后)却完美运行
  • “跨线程操作无效:控件''从创建它的线程以外的线程访问。”
  • 好的,是的,我知道问题出在哪里,但我很难理解调用的东西

标签: c# try-catch menuitem


【解决方案1】:

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

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

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

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

【讨论】:

  • 我正在使用我的精神力量来预测 itowlson 的 pychic 调试会解决这个问题。
  • 从不使用 Invoke。总是 BeginInvoke。
  • “从不”太强了。但你是对的,养成使用 BeginInvoke 的习惯是件好事,除非有特定的理由更喜欢 Invoke。我将更新示例。
【解决方案2】:

将你的捕获更改为

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

【讨论】:

  • 我已经阅读了链接并理解了这个问题,但我对此太陌生了,无法理解我需要做些什么才能使其在第一次尝试时发挥作用。
  • 试试这个.... Action action=new Action(()=>{ trafficManagementToolStripMenuItem.Enabled = true; timer1.Enabled = false; }; if (trafficManagementToolStripMenuItem.InvokeRequired) { trafficManagementToolStripMenuItem.Invoke(动作); } 其他 { 动作(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多