异步调用+事件+调度程序=意外行为

时间:2016-04-06 09:12:25

标签: c# wpf asynchronous dispatcher

我有一个神秘的问题,我无法在我的电脑上重现,但它会在其他电脑上播放。

这是简化剪切,它显示了问题

class SomeViewModel
{
    Item _item;
    Job _job = new Job();

    public SomeViewModel()
    {
        _job.Progress += (s, e) => App.Current.Dispatcher.Invoke(() => Progress());         
    }

    async void DoSomething()
    {
        ...
        SomeItem.SomeProperty = newValue; // this proves SomeItem is not null
        _item = SomeItem;
        var result = await Task<bool>.Run(() => _job.Do());
        _item = null;
        ...
    }

    void Progress()
    {
        if(_item == null) { ... } // sometimes true, why???
        ...
    }
}

class Job
{
    public event EventHandler Progress;

    public bool Do()
    {
        ...
        Progress?.Invoke(this, EventArgs.Empty); // in cycle
        ...
        return true;
    }
}
从按钮命令调用

DoSomething。想法是在字段中存储当前项目并在事件处理程序中访问它。在项目设置为某项内容之前,事件永远不会被称为,在项目设置为null之后永远不会被称为

我的问题:事件处理程序中的_item == null怎么可能?

它将永远不会发生(我的电脑)或每次都发生(其他电脑)。我无法理解错误。有什么想法吗?

0 个答案:

没有答案