Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是线程轮询?_C#_.net_Multithreading - Fatal编程技术网

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.
  }
}