C# 什么是线程轮询?
当一个人说在实现线程解决方案时不允许轮询是什么意思,因为轮询是浪费的,它有延迟并且是不确定的。线程不应该使用轮询来相互发送信号 编辑 根据您目前的回答,我相信下面的线程实现(取自:)没有使用轮询。如果我错了,请纠正我C# 什么是线程轮询?,c#,.net,multithreading,C#,.net,Multithreading,当一个人说在实现线程解决方案时不允许轮询是什么意思,因为轮询是浪费的,它有延迟并且是不确定的。线程不应该使用轮询来相互发送信号 编辑 根据您目前的回答,我相信下面的线程实现(取自:)没有使用轮询。如果我错了,请纠正我 using System; using System.Threading; using System.Collections.Generic; class ProducerConsumerQueue : IDisposable { EventWaitHandle _wh =
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
}
}
}
使用系统;
使用系统线程;
使用System.Collections.Generic;
类ProducerConsumerQueue:IDisposable{
EventWaitHandle_wh=新的自动存储事件(false);
螺纹工;
只读对象_locker=新对象();
队列_tasks=新队列();
公共产品消费者队列()(
_工人=新线程(工作);
_worker.Start();
}
公共void排队任务(字符串任务)(
锁定(_locker)_tasks.Enqueue(task);
_wh.Set();
}
公共空间处置()(
EnqueueTask(null);//通知使用者退出。
_worker.Join();//等待使用者的线程完成。
_wh.Close();//释放所有操作系统资源。
}
无效工作()(
while(true)
{
字符串任务=null;
锁(储物柜)
如果(_tasks.Count>0)
{
task=_tasks.Dequeue();
if(task==null)返回;
}
如果(任务!=null)
{
Console.WriteLine(“正在执行任务:+任务”);
Thread.Sleep(1000);//模拟工作。。。
}
其他的
_wh.WaitOne();//不再有任务-等待信号
}
}
}
您的问题非常不清楚,但“轮询”通常指定期检查条件或采样值。例如:
while (true)
{
Task task = GetNextTask();
if (task != null)
{
task.Execute();
}
else
{
Thread.Sleep(5000); // Avoid tight-looping
}
}
仅仅睡觉是一种效率相对较低的方法-如果有一些协调,线程可以在发生有趣的事情时立即醒来,例如通过监视器。等待/脉冲或手动//
…但是根据上下文,这并不总是可能的
在某些情况下,您可能不希望线程实际处于睡眠状态—您可能希望它可用于其他工作。例如,您可以使用某种类型的计时器,定期轮询邮箱以查看是否有任何传入邮件—但您不需要线程在不检查时实际处于睡眠状态;它可以e被另一个线程池任务重用。您的问题非常不清楚,但通常“轮询”指定期检查条件或对值进行采样。例如:
while (true)
{
Task task = GetNextTask();
if (task != null)
{
task.Execute();
}
else
{
Thread.Sleep(5000); // Avoid tight-looping
}
}
仅仅睡觉是一种效率相对较低的方法-如果有一些协调,线程可以在发生有趣的事情时立即醒来,例如通过监视器。等待/脉冲或手动//
…但是根据上下文,这并不总是可能的
在某些情况下,您可能不希望线程实际处于睡眠状态—您可能希望它可用于其他工作。例如,您可以使用某种类型的计时器,定期轮询邮箱以查看是否有任何传入邮件—但您不需要线程在不检查时实际处于睡眠状态;它可以e被另一个线程池任务重用。给你:查看此网站:
同步技术
同步有两种方法,轮询和使用同步对象。轮询重复检查循环中异步调用的状态。轮询是管理线程的最不有效的方法,因为它通过重复检查各种线程属性的状态来浪费资源
例如,在轮询线程是否已退出时,可以使用IsAlive属性。请谨慎使用此属性,因为活动线程不一定正在运行。您可以使用线程的ThreadState属性获取有关线程状态的更详细信息。因为线程在任何给定时间都可能处于多个状态e、 存储在ThreadState中的值可以是System.Threading.ThreadState枚举中的值的组合。因此,在轮询时应仔细检查所有相关线程状态。例如,如果线程状态指示它未运行,则可以执行该操作。另一方面,它可能处于挂起或休眠状态。
等待线程完成
Thread.Join方法用于确定线程在启动另一个任务之前是否已完成。Join方法等待线程结束的指定时间。如果线程在超时之前结束,Join将返回True;否则将返回False。有关Join的信息,请参阅Thread.Join方法
轮询牺牲了多线程的许多优点,以换取对线程运行顺序的控制。由于轮询效率太低,因此通常不建议使用轮询。更有效的方法是使用Join方法来控制线程。Join会导致调用过程等待线程完成或调用时间如果指定了超时,则输出。名称join基于创建新线程是执行路径中的一个分支的想法。使用join可再次将单独的执行路径合并到单个线程中
有一点应该很清楚:Join是一个同步或阻塞调用。一旦调用Join或wait句柄的wait方法,调用过程就会停止并等待线程发出完成的信号。
抄袭
这些控制线程的简单方法在管理少量线程时很有用,但在大型项目中很难使用。下一节将讨论一些可用于同步线程的高级技术
希望这有帮助
PK来吧:查看此网站:
同步技术
有两种同步方法,轮询和使用
Action<IAsyncResult> myAction = (IAsyncResult ar) =>
{
// Send Nigerian Prince emails
Console.WriteLine("Starting task");
Thread.Sleep(2000);
// Finished
Console.WriteLine("Finished task");
};
IAsyncResult result = myAction.BeginInvoke(null,null,null);
while (!result.IsCompleted)
{
// Do something while you wait
Console.WriteLine("I'm waiting...");
}
private volatile bool shutdownRequested;
void WorkerThread()
{
while (true)
{
// Do some work here.
// This is a safe point so see if a shutdown was requested.
if (shutdownRequested) break;
// Do some more work here.
}
}