다른 작업을위한 대기열을 만들어야합니다.동적 대기열에 작업을 대기열에 넣는 방법
using System;
using System.Threading;
using System.Collections.Generic;
public class PCQueue
{
readonly object _locker = new object();
Thread[] _workers;
Queue<Action> _itemQ = new Queue<Action>();
public PCQueue (int workerCount)
{
_workers = new Thread [workerCount];
// Create and start a separate thread for each worker
for (int i = 0; i < workerCount; i++)
(_workers [i] = new Thread (Consume)).Start();
}
public void Shutdown (bool waitForWorkers)
{
// Enqueue one null item per worker to make each exit.
foreach (Thread worker in _workers)
EnqueueItem (null);
// Wait for workers to finish
if (waitForWorkers)
foreach (Thread worker in _workers)
worker.Join();
}
public void EnqueueItem (Action item)
{
lock (_locker)
{
_itemQ.Enqueue (item); // We must pulse because we're
Monitor.Pulse (_locker); // changing a blocking condition.
}
}
void Consume()
{
while (true) // Keep consuming until
{ // told otherwise.
Action item;
lock (_locker)
{
while (_itemQ.Count == 0) Monitor.Wait (_locker);
item = _itemQ.Dequeue();
}
if (item == null) return; // This signals our exit.
item(); // Execute item.
}
}
}
주요 방법으로 : 현재이 http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse 의해 제공된 예의 정의 버전으로 수행
static void Main()
{
PCQueue q = new PCQueue (2);
Console.WriteLine ("Enqueuing 10 items...");
for (int i = 0; i < 10; i++)
{
int itemNumber = i; // To avoid the captured variable trap
q.EnqueueItem (() =>
{
Thread.Sleep (1000); // Simulate time-consuming work
Console.Write (" Task" + itemNumber);
});
}
q.Shutdown (true);
Console.WriteLine();
Console.WriteLine ("Workers complete!");
}
그러나 동안이 수정 된 버전을 통해 발견 유래 탐색 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Project
{
/// <summary>
/// Description of Multithread.
/// </summary>
public class Multithread<T> : IDisposable where T : class
{
object locker = new object();
Thread[] workers;
Queue<T> taskQ = new Queue<T>();
public void TaskQueue(int workerCount)
{
workers = new Thread[workerCount];
// Create and start a separate thread for each worker
for (int i = 0; i < workerCount; i++)
(workers[i] = new Thread(Consume)).Start();
}
public void Dispose()
{
// Enqueue one null task per worker to make each exit.
foreach (Thread worker in workers) EnqueueTask(null);
foreach (Thread worker in workers) worker.Join();
}
public void EnqueueTask(T task)
{
lock (locker)
{
taskQ.Enqueue(task);
Monitor.PulseAll(locker);
}
}
void Consume()
{
while (true)
{
T task;
lock (locker)
{
while (taskQ.Count == 0) Monitor.Wait(locker);
task = taskQ.Dequeue();
}
if (task == null) return; // This signals our exit
System.Diagnostics.Debug.WriteLine(task);
Thread.Sleep(1000); // Simulate time-consuming task
}
}
}
}
을
더 나은 사용성을 제공하는 것으로 보입니다. 그러나이 대기열에 작업을 올바르게 추가하는 방법을 찾을 수 없습니다.
testthread.EnqueueTask(testclass.functioname());
그러나 작동하지 않는 것 :
classname testclass = new classname();
Multithread<classname> testthread = new Multithread<classname>();
나는이 라인을 따라 뭔가있을 거라 생각 했어요. 이 문제에 붙어있어이 문제에 대한 도움을 찾을 수 없습니다.
포럼 사이트와 달리, 우리가 "감사합니다", 또는 "어떤 도움 감사합니다", 또는 서명을 사용하지 않는 [그래서]. "[태그 라인 및 서명이 허용되지 않습니까?] (http://meta.stackexchange.com/questions/5029/are-taglines-signatures-disallowed)"및 "[안녕하세요, 감사합니다] 태그 라인 및 인사말 게시물에서 삭제 하시겠습니까?] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts) –