0
我想從文章Thread Synchronized Queing爲線程同步排隊更改此代碼會很簡單嗎?
運行的代碼,但得到的編譯錯誤:
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
我的猜測是,它是使用泛型和變化應該是非常容易的,雖然我沒有太多的經驗用它。
我應該如何更改此代碼?
我希望能爲簡單的修改,否則忘了這個
那篇文章的代碼:
using System;
using System.Collections;
using System.Collections.Generic;//per comment by @jam40jeff to answer
using System.Threading;
namespace QueueExample
{
public class SyncQueue// per answer --> public class SyncQueue<T>
{
private WaitHandle[] handles = {
new AutoResetEvent(false),
new ManualResetEvent(false),
};
private Queue _q = new Queue();
////per comment by @jam40jeff to answer, the above line should be changed to
// private Queue<T> _q = new Queue<T>();
public int Count
{
get
{
lock (_q)
{
return _q.Count;
}
}
}
public T Peek() //******error************************
{
lock (_q)
{
if (_q.Count > 0)
return _q.Peek();
}
return default(T);//******error************************
}
public void Enqueue(T element) //******error************************
{
lock (_q)
{
_q.Enqueue(element);
((AutoResetEvent)handles[0]).Set();
}
}
public T Dequeue(int timeout_milliseconds)//******error************************
{
T element;//******error************************
try
{
while (true)
{
if (WaitHandle.WaitAny(handles, timeout_milliseconds, true) == 0)
{
lock (_q)
{
if (_q.Count > 0)
{
element = _q.Dequeue();
if (_q.Count > 0)
((AutoResetEvent)handles[0]).Set();
return element;
}
}
}
else
{
return default(T);//******error************************
}
}
}
catch (Exception e)
{
return default(T);//******error************************
}
}
public T Dequeue() //******error************************
{
return Dequeue(-1);
}
public void Interrupt()
{
((ManualResetEvent)handles[1]).Set();
}
public void Uninterrupt()
{
// for completeness, lets the queue be used again
((ManualResetEvent)handles[1]).Reset();
}
} }
更新:
改變後
public class SyncQueue<T>
according to answer,但也有必要改變從:
return _q.Peek();
到
return (T)_q.Peek();
和
element = _q.Dequeue();
到
element = (T)_q.Dequeue();
UPDATE2:
每答案@ jam40jeff的評論:
- 「更改
_q
是Queue<T>
類型。然後,你將需要使用的語句,但你不會需要強制轉換到T」上面
我更新小號是壞
我希望我糾正其他錯誤的權利,看到我的更新?此外,'使用System.Collections.Generic;'是不必要的(使用) – Fulproof 2013-02-24 17:52:17
將_q更改爲'隊列'類型。那麼你將需要使用聲明,但你不需要演員去'T'。 –
jam40jeff
2013-02-24 20:49:24
@ jam40jeff,非常感謝。現在我明白了 – Fulproof 2013-02-25 04:10:05