2016-03-03 75 views
0

在我簡單的生產者/消費者多線程項目中,我正在使用自定義隊列集合。我定義我的TryDequeue這樣的...如何解決「方法沒有超載,需要0個參數?」錯誤

public bool TryDequeue(out F data) 
{ 
    data = default(F); 
    bool success = false; 
    lock (_queueLock) 
    { 
     if (_queue.Count > 0) 
     { 
      data = _queue.Dequeue(); 
      success = true; 
      count--; 
     } 
    } 
    return success; 
} 

,當我嘗試這個...

private static void Consumer() 
{ 
    while (true) 
    { 
     Thread.Sleep(100); 
     string item = null; 
     lock (sharedQueue) 
     { 
      while (sharedQueue.Count == 0) 
       Monitor.Wait(sharedQueue); 
      item = sharedQueue.TryDequeue(); 
     } 

    Console.WriteLine("Consuming item: {0}", item); 
    } 
} 

這是第二個線程,我得到這個錯誤:

Error 1 No overload for method 'TryDequeue' takes 0 arguments 

燦任何人都幫助我?謝謝。

+1

你的方法有一個你需要傳入的參數'data'。 – juharr

+1

[方法'查詢'沒有重載需要5個參數salesforce]的可能重複(http://stackoverflow.com/questions/32294490/no-重載爲方法查詢採取-5參數銷售隊伍) –

+1

也你真的應該創建單獨的對象用作鎖而不是'lock(sharedQueue)'。 [_最佳做法是定義要鎖定的私有對象或私有靜態對象變量以保護所有實例的通用數據._](https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx) – juharr

回答

2
while (true) 
    { 
     Thread.Sleep(100); 
     string item = null; 
     lock (sharedQueue) 
     { 
      while (sharedQueue.Count == 0) 
       Monitor.Wait(sharedQueue); 

      if(sharedQueue.TryDequeue(out item)) //succes! 
       ... 
      else         //something went wrong 
       ... 
     } 

     Console.WriteLine("Consuming item: {0}", item); 
    } 

你的方法返回一個bool,你需要用括號之間的out關鍵字一起把你的項目。現在你沒有通過預期的out F data參數。

1

item = sharedQueue.TryDequeue();是罪魁禍首。 TryDequeue()需要參數

sharedQueue.TryDequeue(out item);工作嗎?這似乎是你需要做的。

相關問題