2013-02-24 66 views
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的評論:

  • 「更改_qQueue<T>類型。然後,你將需要使用的語句,但你不會需要強制轉換到T」上面

更新小號是壞

回答

2

也許是從作者的錯誤,類SyncQueue應該是通用的:

public class SyncQueue<T> 

,並使用通用的,你還可以添加一個更using

using System.Collections.Generic; 

然後上面的代碼應該沒問題。

+0

我希望我糾正其他錯誤的權利,看到我的更新?此外,'使用System.Collections.Generic;'是不必要的(使用) – Fulproof 2013-02-24 17:52:17

+1

將_q更改爲'隊列'類型。那麼你將需要使用聲明,但你不需要演員去'T'。 – jam40jeff 2013-02-24 20:49:24

+0

@ jam40jeff,非常感謝。現在我明白了 – Fulproof 2013-02-25 04:10:05