C# 在多线程处理时从其他类更新一个类的属性
我使用的是WPF和MVVM模式,但这在本例中并不相关。在我的ViewModelC# 在多线程处理时从其他类更新一个类的属性,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列表。(实际上,我想使用构造函数提供它,但我不能。请
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));}```