記事のコードを実行しようとしていますThread Synchronized Queing
しかし、コンパイルエラーが発生します:
型または名前空間名 'T' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
私の推測では、それはジェネリックを使用しており、あまり経験がありませんが、変更はかなり簡単であるはずです。
このコードをどのように変更すればよいですか?
私はかなり単純な変更を望んでいます。それ以外の場合は忘れてください
その記事のコード:
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>
回答によると、次から変更する必要もありました。
return _q.Peek();
に
return (T)_q.Peek();
そしてから
element = _q.Dequeue();
に
element = (T)_q.Dequeue();
Update2:
回答に対する @jam40jeff のコメントごと:
_q
「タイプが になるように変更しますQueue<T>
。次に、using ステートメントが必要になりますが、T へのキャストは必要ありません」
上記の私の更新は悪かった