忙着等待C#

Kon*_*che 0 c# concurrency multithreading

你如何以一种不完全低效的方式实现忙碌的等待?我面临的问题是我只能以拉取方式加载模型的数据,这意味着我必须以连续的方式调用getXYZ()方法.

这种情况发生的速度不足以进行用户交互,但很快就会发生,当GUI中的状态发生变化时,可以注意到模型并且getXYZ()方法接收到新状态.

我的方法只是:

while (c.hasChanged()) {
   Thread.sleep(500);
}
updateData();
Run Code Online (Sandbox Code Playgroud)

有更好的机制吗?

Mar*_*mić 5

您的问题似乎可以通过线程解决.

在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关键字旨在防止(伪)编译器对假定变量值无法更改的代码应用任何优化