c#:什么是线程轮询?

标签 c# .net multithreading

当有人说在实现您的线程解决方案时不允许轮询是什么意思,因为它很浪费,它有延迟并且是不确定的。线程不应使用轮询来相互发送信号。

编辑

根据您目前的回答,我相信我下面的线程实现(取自:http://www.albahari.com/threading/part2.aspx#_AutoResetEvent)没有使用轮询。如果我错了,请纠正我。

using System;
using System.Threading;
using System.Collections.Generic;

class ProducerConsumerQueue : IDisposable {
  EventWaitHandle _wh = new AutoResetEvent (false);
  Thread _worker;
  readonly object _locker = new object();
  Queue<string> _tasks = new Queue<string>();

  public ProducerConsumerQueue() (
    _worker = new Thread (Work);
    _worker.Start();
  }

  public void EnqueueTask (string task) (
    lock (_locker) _tasks.Enqueue (task);
    _wh.Set();
  }

  public void Dispose() (
    EnqueueTask (null);     // Signal the consumer to exit.
    _worker.Join();         // Wait for the consumer's thread to finish.
    _wh.Close();            // Release any OS resources.
  }

  void Work() (
    while (true)
    {
      string task = null;
      lock (_locker)
        if (_tasks.Count > 0)
        {
          task = _tasks.Dequeue();
          if (task == null) return;
        }
      if (task != null)
      {
        Console.WriteLine ("Performing task: " + task);
        Thread.Sleep (1000);  // simulate work...
      }
      else
        _wh.WaitOne();         // No more tasks - wait for a signal
    }
  }
}

最佳答案

您的问题很不清楚,但通常“轮询”是指定期检查条件或对值进行采样。例如:

while (true)
{
    Task task = GetNextTask();
    if (task != null)
    {
         task.Execute();
    }
    else
    {
         Thread.Sleep(5000); // Avoid tight-looping
    }
}

只是休眠是一种相对低效的方式 - 如果有一些协调会更好,这样线程可以在有趣的事情发生时立即唤醒,例如通过 Monitor.Wait/PulseManual/AutoResetEvent... 但根据上下文,这并不总是可能。

在某些情况下,您可能不希望线程真正休眠——您可能希望它可以用于其他工作。例如,您可以使用一种或其他类型的 Timer 来定期轮询邮箱以查看是否有任何传入邮件 - 但您不需要线程在不检查时实际休眠;它可以被另一个线程池任务重用。

关于c#:什么是线程轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849697/

相关文章:

c# - 是什么导致 Mono 下的 SerialPort.Write 出现偶发错误?

c# - 如何循环遍历目录C#中的所有文本文件

c# - C# 中的 Dispose 方法有什么作用?

.net - .NET 框架更新是否会推送给每个 Windows 更新用户?

asp.net - ASP.Net 中的请求之间是否重用线程?

java - 使用多线程java服务器获取客户端ID

c# - 如何在Web api中压缩HttpClient post并接收数据

c# - 如何从 WPF 应用程序中的相对路径加载?

c# - 如何使两个不同的 C# 应用程序在连续线程中访问同一目录?

java - Java 套接字中的并行处理无法正常工作