任务中的属性值不同

时间:2018-08-14 08:35:14

标签: c# .net multithreading task

由于某些原因,在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();
    }

2 个答案:

答案 0 :(得分:2)

Task.Run在线程池中安排工作 -即在将来的某个未定义时间。您所拥有的基本上是:

  • 将其标记为进行中
  • 安排一些工作在将来的某个不确定时间点
  • 将其标记为未进行

在几乎所有情况下,在标记为未进行处理时,线程池甚至都不会使该项目出队列,更不用说开始运行它了。

也许将其标记为进行中/未进行中作为计划工作的一部分,即 inside Task.Run()回调中。

答案 1 :(得分:1)

您不会await执行任务。这意味着您的Task.Run可能在RemoveProgress之后执行。所以,这就是执行流程

SetProgress设置了true,然后它执行了RemoveProgress,您的属性仍然是true

RemoveProgress将您的财产作为true并将其设置为false。接下来,它运行任务,您的属性位于其中的false

尝试组织代码,考虑一下awaitContinueWith任务