从异步方法显示表单并等待结果会导致出现额外的空白表单



好的,开始吧。

我正在CefSharp Winforms最小示例的基础上构建一个C#Winforms应用程序。

我已经将所有代码从主窗体的构造函数中移到一个名为Initialize((的新方法中。所以我实例化,然后调用Initialize。

var shellForm = new ShellForm();
shellForm.Initialize();
Application.Run(shellForm);

Initialize((被声明为async void,因为在它中间的某个位置显示了一个表单,在继续操作之前需要从中进行用户输入。

//set up the form based on the number of projects and their names
ProjectSelect projectSelectForm = new ProjectSelect();
projectSelectForm.SetUpForm(projPaths); //show/hide buttons based on length of list
projectSelectForm.TopMost = true;
projectSelectForm.Show();
await projectSelectForm.WhenEventTriggered();

任务等待的东西在这个类中实现:

public static class ProjectSelectEventWaiter
{
public static Task WhenEventTriggered(this ProjectSelect ps)
{
var tcs = new TaskCompletionSource<bool>();
ProjSelEvtHandler handler = null;
handler = (selected) =>
{
tcs.TrySetResult(true);
ps.ProjectSelected -= handler;
};
ps.ProjectSelected += handler;
return tcs.Task;
}
}

一切都很好,只是当显示projectSelectForm时,另一个空白表单会出现在左上方。当我单击此表单上的"关闭"时,VS调试器将停止。但是,如果Initialize((没有声明为async(并且await被删除(,那么这个空白表单就不会出现。空白表单出现在左上角

我想在上面的所有内容中都有几个"不"。我不是软件工程师,我做这个项目是为了展示一个重要的商业案例,没有其他人可以做

问题是:为什么会出现这种形式,我该如何阻止它出现?

问题很可能是错误的表单变成了应用程序的主表单。似乎您打算将ShellForm作为应用程序的主窗体,但在完全初始化之前,您正在显示另一个窗体。这通常不是一个好主意。

在显示任何其他表单以解决问题之前,您可能需要完全创建主表单。这可能需要重写以进行多步骤初始化,首先加载shellform,然后请求项目,最后进行shellForm的最终初始化。

另一种解决方法是创建一个隐藏表单作为主表单。这样,您就可以在shell窗体之前显示ProjectSelection窗体。

最新更新