【问题标题】:Property value different in Task任务中的属性值不同
【发布时间】:2018-08-14 08:35:14
【问题描述】:

由于某种原因,在 EnterPressed 方法中 IsFiltered 属性设置为 true。一旦进入任务,该属性就会返回为假。一旦离开任务,它就会返回 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();
    }

【问题讨论】:

  • 您是指IsFiltering 属性吗?你没有显示IsFiltered
  • 是的,我的意思是对不起

标签: c# .net multithreading task


【解决方案1】:

Task.Run 调度工作在线程池上 - 即在未来某个未定义的时间点。你所拥有的基本上是:

  • 标记正在进行中
  • 安排一些工作在未来某个未定义的时间发生
  • 标记为未进行中

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

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

【讨论】:

    【解决方案2】:

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

    SetProgress设置true,那么,它执行RemoveProgress,你的属性还是true

    RemoveProgress 接收您的属性为true 并将其设置为false。接下来,它运行任务,你的属性在它里面是false

    试着组织你的代码,想想awaitContinueWith这个任务

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-12-04
      相关资源
      最近更新 更多