0

記事のコードを実行しようとしています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 へのキャストは必要ありません」

上記の私の更新は悪かった

4

1 に答える 1

2

多分それは作者からの間違いです、クラスSyncQueueはジェネリックでなければなりません:

public class SyncQueue<T>

また、ジェネリックを使用するには、もう 1 つ追加しますusing

using System.Collections.Generic;

次に、上記のコードは問題ないはずです。

于 2013-02-24T17:19:30.877 に答える