由于某些原因,在EnterPressed方法中将IsFiltered属性设置为true。输入任务后,该属性将返回为false。但是,一旦离开任务,它将恢复为true(然后在Remove Progress方法中为false)。
我想念什么?有人可以提供指向我正确方向的链接或教程吗?
使用C#,Caliburn Micro和VS2017。
public bool IsFiltering
{
get;
private set;
}
public bool ShowGrid
{
get
{
return !this.IsFiltering;
}
}
public void SetProgress()
{
this.IsFiltering = true;
NotifyOfPropertyChange("IsFiltering");
NotifyOfPropertyChange("ShowGrid");
}
public void EnterPressed()
{
SetProgress();
Task.Run(() =>
{
if (this.searchFilter != "")
{
var filtered = Expenses.Where(exp => exp.ExpenseDescription.StartsWith(searchFilter.ToUpper())).ToList();
var obsFiltered = new ObservableCollection<Models.Expense>(filtered);
this.transactionReader.Expenses = obsFiltered;
NotifyOfPropertyChange(() => Expenses);
}
Debug.WriteLine("EnterPressed called :: searchFilter is: " + this.searchFilter);
});
RemoveProgress();
}
答案 0 :(得分:2)
Task.Run
在线程池中安排工作 -即在将来的某个未定义时间。您所拥有的基本上是:
在几乎所有情况下,在标记为未进行处理时,线程池甚至都不会使该项目出队列,更不用说开始运行它了。
也许将其标记为进行中/未进行中作为计划工作的一部分,即 inside 在Task.Run()
回调中。
答案 1 :(得分:1)
您不会await
执行任务。这意味着您的Task.Run
可能在RemoveProgress
之后执行。所以,这就是执行流程
SetProgress
设置了true
,然后它执行了RemoveProgress
,您的属性仍然是true
。
RemoveProgress
将您的财产作为true
并将其设置为false
。接下来,它运行任务,您的属性位于其中的false
。
尝试组织代码,考虑一下await
或ContinueWith
任务