Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的ReSharper修改的form.Show()代码不起作用?_C#_Winforms_Multithreading_Resharper - Fatal编程技术网

C# 为什么我的ReSharper修改的form.Show()代码不起作用?

C# 为什么我的ReSharper修改的form.Show()代码不起作用?,c#,winforms,multithreading,resharper,C#,Winforms,Multithreading,Resharper,我正在将ReSharper与C#/VS2010一起使用。我正在运行一个单独的线程,它需要打开一个表单,在主UI线程上向用户显示一些信息。我的代码是这样的(非常有效): this.Invoke(new MethodInvoker(delegate() { using (var form2 = new DisplayDownload {TopMost = true}) { form2.Show(); } })); ReSharper想将其更改为此,我



我正在将ReSharper与C#/VS2010一起使用。我正在运行一个单独的线程,它需要打开一个表单,在主UI线程上向用户显示一些信息。我的代码是这样的(非常有效):

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


ReSharper想将其更改为此,我允许它(但以下代码根本不显示表单):

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


表单将不再显示修改了ReSharper代码的表单。如果我回到旧代码,它工作得很好


为什么在ReSharper更改它之后它不工作?有人能给我解释一下是什么原因导致修改后的代码不再显示表单吗?

在Resharper更改表单后,它不起作用,因为您只是在显示表单后处理表单,所以您没有使其显示的更改

但是,Resharper希望将其更改为这种方式,因为您正在方法内创建
IDisposable
对象“DisplayDownload表单”,并且在您使用完它之后“Resharper不知道
Show()
方法将保持表单显示…”,您不会处理它,但是,您应该在类级别声明您的
DisplayDownload
,并且只在方法上显示它。比如:

DisplayDownload form2 = new DisplayDownload();

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

我相信这是由于使用关键字。考虑到Show()并没有阻塞调用,在这之后,程序将使用被调用表单的语句和Dispose()离开


问候。

像我在文章的第一个示例代码中那样,不就可以了吗?它在第一个示例中运行良好,但在ReSharper示例中没有。USING语句是问题的根源吗?我不应该在USING语句中封装Show()调用?不是Show()调用,但不要在USING语句中封装Form对象在这种情况下,在其他情况下,如果调用ShowDialog(),可能是可接受的解决方案。是的,决不能将USING with Show()用于。Show将窗体保持在非模态状态,而Dispose(使用的端括号)将其关闭。。。R#在那里没有区别。它只是看到您已经在本地实例化了一个表单对象,并且它是可识别的,因此应该在退出应用程序之前对其进行处理。在方法退出后,form对象将是“活动”的,因此您应该考虑将其设置为封闭类的成员,而不是方法的本地成员。否则,每次调用此代码时,您都将创建一个新表单。