C# 在多线程处理时从其他类更新一个类的属性

C# 在多线程处理时从其他类更新一个类的属性,c#,multithreading,C#,Multithreading,我使用的是WPF和MVVM模式,但这在本例中并不相关。在我的ViewModelMainVM中,我有如下属性: public int Posts { get { return this.posts; } set { this.posts = value; this.OnPropertyChanged(nameof(this.Posts)); } } 通过属性,我提供了MainVM一个Foo列表。(实际上,我想使用构造函数提供它,但我不能。请

我使用的是WPF和MVVM模式,但这在本例中并不相关。在我的ViewModel
MainVM
中,我有如下属性:

public int Posts {
    get { return this.posts; }
    set {
        this.posts = value;
        this.OnPropertyChanged(nameof(this.Posts));
    }
}
通过属性,我提供了
MainVM
一个
Foo
列表。(实际上,我想使用构造函数提供它,但我不能。请阅读下面的内容)并且在
MainVM
上有一个start方法,其作用如下:

foreach(Foo foo in this.Foos){ // this.Foos is just a List<Foo>
    Task.Run(() => foo.Bar());
}
然后我让
Foo
在构造函数中执行
Action
。下面是如何创建
Foos
并将其传递给
MainVM

public void IncrementPosts()
{
    lock(this.whatever) 
    {
        this.Posts++;
    }
}   
var vm = new MainVM();

var foo1 = new Foo(vm.IncrementPosts);
var foo2 = new Foo(vm.IncrementPosts);

vm.Foos = new List<Foo>() {foo1, foo2};
var vm=new MainVM();
var foo1=新的Foo(vm.IncrementPosts);
var foo2=新的Foo(vm.IncrementPosts);
vm.Foos=newlist(){foo1,foo2};
虽然这样做有效,但我觉得它看起来很难看。首先,
MainVM
需要
Foo的列表才能正常工作。所以它应该被提供给构造器,对吗?但是由于
Foo
需要一个指向
MainVM
中的方法的操作,我不能这样做。所有这些看起来都像是黑客


有更好的方法吗?

如果我明白了,你想做什么

void Main()
{
    var vm = new MainVM(new FooFactory());
    Console.WriteLine(vm.Posts);
    vm.ExecuteFoo();
    Console.WriteLine(vm.Posts);    
}

public class Foo
{
    private Action _action;
    public Foo(Action action)
    {
        _action = action;
    }

    public void RunAction()
    {
        _action();
    }
}

public class FooFactory
{   
    public Foo[] CreateFoo(MainVM vm)
    {
        return new[] { new Foo(()=>vm.Posts++) };
    }
}

public class MainVM : INotifyPropertyChanged
{
    public MainVM(FooFactory factory)
    {
        _foos = factory.CreateFoo(this);
    }

    public void ExecuteFoo()
    {
        foreach(var foo in _foos)
        foo.RunAction();
    }

    private Foo[] _foos;

    private int posts;
    public int Posts
    {
        get { return this.posts; }
        set
        {
            this.posts = value;
            this.OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {       
        var local = PropertyChanged;
        if (local != null)
        {
            local(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

@Downvoter,如果你能就这个问题发表评论,那就太好了,为什么你觉得应该被否决。至少我知道还有什么需要改进。帖子的增量并没有被锁定?这只是一个示例,如何将foo创建传递给视图模型。锁太贵了,如果只需要增量,请使用interlocked class.Yep。在interlocked的情况下,您应该使用类似于``public void IncreasePosts(){interlocked.Add(ref posts,1);OnPropertyChanged(nameof(posts));}```