我尝试等待类实例化结束。 我的架构如下。 Cook是CookChief的继承人。 如果我实例化cook,则CookChief会创建自己,但是CookChief会调用另一个名为Cookhelper的类,cookhelper正在等待输入,而我想在Cook中等待这种输入方法。 事情是iam在MVVM Galasoft中创建的,我的入口点是带有中继命令的CookViewmodel。
在下面的代码中,您可以看到我的体系结构。简而言之,我想等到这个布尔处理完毕后再等待Task.Run(()=> ValidateForDeviceId());完成。
我的第一步是外包每个类的构造函数。并创建一个init方法。 这是我的代码:
public CookViewModel()
{
startCookButtonCommand = new RelayCommand(Cook);
}
private async Task Cook()
{
cook.Init();
}
public class Cook : CookChief
{
public Cook()
{
}
public async Task Init()
{
await this.CookChiefInit();
//here I want to wait until CookChiefInit is finished
Cooking();
}
public void Cooking()
{
MessageBox.Show("Input received");
}
}
现在是厨师:
public Cookchief()
{
}
protected async Task CookchiefInit()
{
this.Cookhelper = new Cookhelper();
Cookhelper.CookHelperInit();
}
在CookHelper中,我们这样做:
public CookHelper()
{
}
public void CookHelperInit()
{
this.driverWindow = new DriverWindow();
startProc();
}
private async void startProc()
{
ShowOrCloseDriverWindow(true);
//this is the task what we wait for before we can repeat
bool processed = await Task.Run(() => ValidateForDeviceId());
if(processed)
{
ShowOrCloseDriverWindow(false);
}
else
{
MessageBox.Show("DriverError");
}
}
private bool ValidateForDeviceId()
{
for (; ; )
{
this.deviceId = Input.deviceId;
if (deviceId > 0)
{
break;
}
}
return true;
}
答案 0 :(得分:1)
根据注释中的讨论,这里的问题是初始化例程混合了同步方法和异步方法以及调用。此外,某些async
方法在没有await
关键字的情况下被调用。解决方案是使所有调用异步并await
。
cook.Init()
需要一个await
:
private async Task Cook()
{
await cook.Init();
}
在CookchiefInit()
中,需要CookHelperInit()
进行await
呼叫:
protected async Task CookchiefInit()
{
this.Cookhelper = new Cookhelper();
Cookhelper.CookHelperInit();
}
要await
CookHelperInit()
,必须使其异步。 startProc()
调用是对async
方法的,因此还必须等待它:
public async Task CookHelperInit()
{
this.driverWindow = new DriverWindow();
await startProc();
}