Kon*_*che 0 c# concurrency multithreading
你如何以一种不完全低效的方式实现忙碌的等待?我面临的问题是我只能以拉取方式加载模型的数据,这意味着我必须以连续的方式调用getXYZ()方法.
这种情况发生的速度不足以进行用户交互,但很快就会发生,当GUI中的状态发生变化时,可以注意到模型并且getXYZ()方法接收到新状态.
我的方法只是:
while (c.hasChanged()) {
Thread.sleep(500);
}
updateData();
Run Code Online (Sandbox Code Playgroud)
有更好的机制吗?
您的问题似乎可以通过线程解决.
在WPF中,您可以:
Thread t = new Thread((ThreadStart)delegate() {
while (true) {
Thread.sleep(500);
if (c.hasChanged())
Dispatcher.Invoke((Action)delegate() {updateData();});
}
}).Start();
Run Code Online (Sandbox Code Playgroud)
在WinForms中
Thread t = new Thread((ThreadStart)delegate() {
while (true) {
Thread.sleep(500);
// this must derive from Control
if (c.hasChanged())
this.Invoke((Action)delegate() {updateData();});
}
}).Start();
Run Code Online (Sandbox Code Playgroud)
Invoke可能缺少参数(这是在调用UI线程上执行代码所需的),但我是从脑中写出来的,所以没有intellisense处理:D
在.NET 4中,您可以使用TaskFactory.StartNew而不是自己生成一个线程.在.Net <= 4中,您可以使用TreadPool作为线程.但是我记得你需要立即运行它,因为你希望它尽快检查并且线程池不会向你保证(它可能已经满了,但不太可能:-).只是不要做愚蠢的事情,比如在循环中产生更多的东西!
在线程中你应该像检查一样
while (!Closing)
Run Code Online (Sandbox Code Playgroud)
这样线程可以在你需要的时候完成,而不必t.Abort();
在退出时使用像An 这样的坏东西将Closing设置为true并执行a t.Join()关闭checker线程.
编辑:
我忘了说Closing应该是一个bool属性或一个VOLATILE布尔值,而不是一个简单的布尔值,因为你不能确保线程可以完成(好吧,如果你关闭应用程序,但它是良好的做法,让他们按照你的意愿完成).volatile关键字旨在防止(伪)编译器对假定变量值无法更改的代码应用任何优化