【发布时间】:2019-05-26 10:25:30
【问题描述】:
我有一个问题。我有启动按钮ActivateItem:
public void LoadTaskManagerPage()
{
this.ActivateItem(new TaskManagerViewModel(this.LoggedUser, this.repository));
if (this.LoggedUser.GetUserTask() != null)
{
this.IsActiveTaskButtonVisible = Visibility.Visible;
this.NotifyOfPropertyChange(() => this.IsActiveTaskButtonVisible);
}
}
如果ActivateItem 结束,是否可以hang 一个应用程序并仅转到if 语句?
如何在 Caliburn.Micro 中等待 ActivateItem 结束?
编辑:
尝试类似:
public void LoadTaskManagerPage()
{
var taskManagerTask = Task.Run(() => this.ActivateItem(new TaskManagerViewModel(this.LoggedUser, this.repository)));
taskManagerTask.Wait();
if (!this.LoggedUser.GetUserTask().IsTaskTakenByUser())
{
this.IsActiveTaskButtonVisible = Visibility.Visible;
this.NotifyOfPropertyChange(() => this.IsActiveTaskButtonVisible);
}
}
使用任务,但是当我点击LoadTaskManagerPage() 时它不会显示任何窗口,应用程序永远挂起
EDIT2
基于我在 github 上的issue,我将 Caliburn 升级到了alpha 4.0:
public void LoadTaskManagerPage()
{
this.ActivateItemAsync(new TaskManagerViewModel(this.LoggedUser, this.repository));
if (!this.LoggedUser.GetUserTask().IsTaskTakenByUser())
{
//logic
}
}
我将ActiveItem() 更改为ActiveItemAsync(),但它仍然在活动项目关闭之前命中if 语句。使用async/await 做同样的事情
EDIT3
当我创建async/await 时,它仍然可以正常工作,请查看我在右侧的视图。点击它,User Control 不会出现。同时(即使我的User Control 没有出现)我过早地点击if 声明。我想在User Control 关闭它。
【问题讨论】:
-
看起来你想在这里使用异步和等待。希望这对你有帮助c-sharpcorner.com/article/async-and-await-in-c-sharp
-
你可以看看我的编辑
-
您需要等待
ActivateItemAsync。但是“在活动项目关闭之前”是什么意思?当您致电ActivateItemAsync时会发生什么?您预计会发生什么? -
@mm8 我正在为我的问题寻找解决方案。我启动
ActivateItemAsync(),我想等待它结束,然后我想去if()声明。正如您在 EDIT2 中看到的那样,我尝试了await/async并同时转到If语句,当我单击LoadTaskmanagerPage按钮时,将激活User ControlTaskmanagerViewModel跨度> -
@michasaucer:你不需要等待 EDIT2 中的方法。
标签: c# wpf caliburn.micro