2010-10-03 10 views
1

Что это означает, что если вы говорите, что опрос не разрешен при внедрении вашего потока решения, поскольку он расточительный, он имеет латентность, и он не является детерминированным. Нитки не должны использовать опрос, чтобы сигнализировать друг другу.C#: что такое опрос?

EDIT

на основе ваших ответов до сих пор, я считаю, моя реализация многопоточности (взятую из: 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 
    } 
    } 
} 
+2

Вы имеете в виду объединение? –

+0

Вам нужно дать больше информации о том, где вы слышали этот термин и, в частности, что * вы пытаетесь достичь. –

+0

Нет, не пул - это опрос – Moon

ответ

10

Ваш вопрос очень неясно, но, как правило, «опрос» относится к периодически проверяя состояние, или выборки значения. Например:

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

Просто спать является относительно неэффективным способом сделать это - это лучше, если есть какая-то координация, так что поток может проснуться сразу, когда что-то интересное происходит, например, через Monitor.Wait/Pulse или Manual/AutoResetEvent ... но в зависимости от контекста это не всегда возможно.

В некоторых контекстах вы, возможно, не хотите, чтобы нить действительно спала - вы можете захотеть, чтобы она стала доступной для другой работы. Например, вы можете использовать Timer одного типа для периодического опроса почтового ящика, чтобы узнать, есть ли какая-либо входящая почта, но вам не нужен поток, чтобы действительно спать, когда он не проверяет; он может быть повторно использован другой задачей пула потоков.

+0

очень полезный Джон! – nawfal

1

Здесь вы идете: проверить этот сайт:

http://msdn.microsoft.com/en-us/library/dsw9f9ts%28VS.71%29.aspx

Синхронизация Методы

Есть два подхода к синхронизации, опроса и использования объектов синхронизации. Опрос неоднократно проверяет состояние асинхронного вызова из цикла. Опрос - это наименее эффективный способ управления потоками, поскольку он тратит ресурсы, многократно проверяя статус различных свойств потока.

Например, свойство IsAlive может использоваться при опросе, чтобы узнать, вышел ли поток. Используйте это свойство с осторожностью, потому что живой поток не обязательно работает. Вы можете использовать свойство ThreadState потока, чтобы получить более подробную информацию о состоянии потока. Поскольку потоки могут быть в нескольких состояниях в любой момент времени, значение, хранящееся в ThreadState, может быть комбинацией значений в перечислении System.Threading.Threadstate. Следовательно, вы должны тщательно проверять все соответствующие состояния нитей при опросе. Например, если состояние потока указывает, что оно не работает, это может быть сделано. С другой стороны, это может быть приостановлено или спать. Ожидание резьбы до конца

Метод Thread.Join полезен для определения завершения потока перед началом другой задачи. Метод Join ожидает определенное количество времени для завершения потока. Если поток заканчивается до таймаута, Join возвращает True; в противном случае он возвращает False. Информацию о соединении см. В разделе Thread.Join Method

Опрос жертвует многими преимуществами многопоточности в обмен на контроль за тем, как выполняется поток. Поскольку он настолько неэффективен, опрос вообще не рекомендуется. Более эффективный подход будет использовать метод Join для управления потоками.Соединение заставляет вызывающую процедуру ждать либо до тех пор, пока не будет выполнен нить, либо до тех пор, пока вызов не истечет, если указан таймаут. Имя, join, основано на идее, что создание нового потока является вилкой в ​​пути выполнения. Вы используете Join, чтобы снова объединить отдельные пути выполнения в одну нить.

Необходимо указать одно очко: Соединение является синхронным или блокирующим вызовом. Когда вы вызываете метод Join или wait для дескриптора ожидания, вызывающая процедура останавливается и ждет, пока поток не сообщит, что это сделано. Копирование

Sub JoinThreads() 
    Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask) 
    Thread1.Start() 
    Thread1.Join()  ' Wait for the thread to finish. 
    MsgBox("Thread is done") 
End Sub 

Эти простые способы управления потоками, которые полезны, когда вы управляете небольшим количеством нитей, которые трудно использовать с большими проектами. В следующем разделе обсуждаются некоторые передовые методы, которые можно использовать для синхронизации потоков.

Надеюсь, это поможет.

PK

1

опрос можно использовать в качестве ссылки на четыре моделей .NET асинхронных использует для выполнения делегата.

4 типов (я взял эти описания из этой скважины объяснил answer) являются:

  1. Опрос: ожидание в цикле для IAsyncResult.Completed, чтобы быть правдой
  2. Я позвоню вам
  3. Вы называете меня
  4. меня не волнует, что происходит (огонь и забыть)

So для exampl е :

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..."); 
} 

Там же альтернативные способы опроса, но в целом это означает, что «я мы там еще», «Я мы там еще», «Я мы там еще»

1

Что это значит, когда говорят, что опрос разрешен, когда импонирует ваше поточное решение, так как оно расточительно, оно имеет латентность и это недетерминировано. Нитки не должны использовать опрос, чтобы сигнализировать друг другу.

Мне нужно было бы увидеть контекст, в котором это заявление было сделано, чтобы выразить мнение об этом в любом случае. Однако, взят как есть явно ложно. Опрос - очень распространенная и очень принятая стратегия передачи сигналов.

В значительной степени все стратегии блокировки потоков без блокировки используют опрос в той или иной форме. Это ясно видно, как эти стратегии обычно вращаются в цикле до тех пор, пока не будет выполнено определенное условие.

Наиболее часто используемый сценарий - это сигнализация рабочего потока, что пора прекратить действие. Рабочий поток будет периодически опробовать флаг bool в безопасных точках, чтобы узнать, было ли запрошено выключение.

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