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对象将是“活动”的,因此您应该考虑将其设置为封闭类的成员,而不是方法的本地成员。否则,每次调用此代码时,您都将创建一个新表单。