【问题标题】:Why does my ReSharper modified form.Show() code not work?为什么我的 ReSharper 修改 form.Show() 代码不起作用?
【发布时间】:2011-07-31 08:38:28
【问题描述】:



我正在使用带有 C#/VS2010 的 ReSharper。我正在运行一个单独的线程,该线程需要打开一个表单以在主 UI 线程上向用户显示一些信息。我的代码是这样的(效果很好):

this.Invoke(new MethodInvoker(delegate()
{
    DisplayDownload form2 = new DisplayDownload();

    form2.TopMost = true;
    form2.Show();
}));



ReSharper 想把它改成这个,我让它(但下面的代码根本不显示表单):

this.Invoke(new MethodInvoker(delegate()
{
   using (var form2 = new DisplayDownload {TopMost = true})
      {
         form2.Show();
      }
}));



ReSharper 修改后的代码不再显示该表单。如果我回到旧代码,它工作正常。

为什么 ReSharper 改了之后就不行了?有人可以向我解释一下是什么导致修改后的代码不再显示表单吗?

【问题讨论】:

    标签: c# winforms multithreading resharper


    【解决方案1】:

    我相信这是由于使用了 USING 关键字。考虑到 Show() 不是阻塞调用,之后程序离开 using 语句和调用形式的 Dispose()。

    问候。

    【讨论】:

    • 我不应该将 Show() 调用封装在 USING 语句中?
    • 是的,永远不要与 Show() 一起使用。 Show 将表单保持在非模态状态,而 Dispose(使用的结束大括号)将其关闭... R# 并没有在那里进行区分。它只是看到您已经在本地实例化了一个 Form 对象并且它是 IDisposable ,因此它应该在应用程序退出之前被释放。方法退出后,表单对象将是“活动的”,因此您应该考虑使其成为封闭类的成员,而不是方法的本地成员。否则,每次调用此代码时,您都将创建一个新表单。
    【解决方案2】:

    Resharper 更改后它不起作用,因为您在显示表单后立即处理表单,因此您没有进行更改以使其显示。

    但是 Resharper 想要将其更改为这种方式,因为您正在方法中创建 IDisposable 对象“DisplayDownload 表单”,并且在您完成使用它之后“Resharper 不知道 Show() 方法将保留显示..”的表单,您不会处理它,但是您应该在类级别声明您的 DisplayDownload 并仅在您的方法上显示它。喜欢:

    DisplayDownload form2 = new DisplayDownload();
    
    private void YourSubMethod()
    {
        this.Invoke(new MethodInvoker(delegate()
        {
            form2.Show();
        }));
    }
    

    【讨论】:

    • 像我在帖子的第一个示例代码中那样保留它是不是不行?它在第一个示例中运行良好,但在 ReSharper 示例中却不行。 USING 语句是否导致了问题?
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 2010-10-30
    • 2014-01-23
    • 2013-08-06
    • 2016-01-23
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多