【问题标题】:How to correctly update a property of an object from a BackgroundWorker launched in the code of a methode of this object?如何从在该对象的方法代码中启动的 BackgroundWorker 正确更新对象的属性?
【发布时间】:2018-07-19 14:19:03
【问题描述】:

如果标题清楚,现在不要。下面是负责管理长操作的类的一段代码:

public class LongProcess
{
    public delegate void RunningChangedEventHandler(bool running);

    public event RunningChangedEventHandler RunningChanged;

    private object runningLock = new object();
    public bool Running
    {
        get { lock (runningLock) { return mRunning; } }
        set
        {
            lock (runningLock)
            {
                RunningChanged.Invoke(value);
                value = mRunning;
            }
        }
    }

    public void start()
    {
        mWorker = new BackgroundWorker();
        mWorker.DoWork += Bg_DoWork;
        mWorker.RunWorkerAsync();
    }

    private void Bg_DoWork(object sender, DoWorkEventArgs e)
    {
        Running = true;
        // Some things to do here ... but I need Running to be equals to true and it is not
    }
}

在主程序中,我使用 LongProcess 来启动一些任务,它是通过报告进度等来完成的......

我面临的唯一问题是,我似乎无法将“正在运行”设置为 true。即使在调用 setter 之后,它仍然保持其旧值。

任何有关其工作原理的帮助和解释将不胜感激!

【问题讨论】:

    标签: c# multithreading locking backgroundworker


    【解决方案1】:

    你在 setter 中有错误的值和字段。你需要这个:

    public bool Running
    {
        get { lock (runningLock) { return mRunning; } }
        set
        {
            lock (runningLock)
            {
                RunningChanged.Invoke(value);
                mRunning = value; // <=== LOOK HERE
            }
        }
    }
    

    【讨论】:

    • 天啊……我觉得自己太笨了!几个小时没有看到这样的失败......非常感谢,你为我节省了很多时间,你又给了我另一个证据,证明我真的需要假期......
    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 2020-06-24
    • 2018-12-19
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多