2010-01-22 18 views
9

मैं त्रुटि देख सकते हैं: त्रुटि 'System.Windows.Forms.Timer' और 'System.Threading.Timer' के बीच एक अस्पष्ट संदर्भ है

 
'Timer' is an ambiguous reference between 'System.Windows.Forms.Timer' and 'System.Threading.Timer' 
जब मैं घड़ी के लिए कोड जोड़ा

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.Sockets; 
using System.Threading; 
using System.Security.Cryptography; 


namespace SocketClient 
{ 

    public partial class SocketClient : Form 
    { 
     System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
     NetworkStream serverStream = default(NetworkStream); 
     string readData = null; 


     public SocketClient() 
     { 
      InitializeComponent(); 
      Timer timer = new Timer(); 
      timer.Tick += new EventHandler(TimerOnTick); 
      timer.Interval = 1000; 
      timer.Start(); 
     } 



     private void TimerOnTick(object sender, EventArgs ea) 
     { 
      Invalidate(); 
     } 

     protected override void OnPaint(PaintEventArgs pea) 
     { 
      StringFormat strfmt = new StringFormat(); 
      strfmt.Alignment = StringAlignment.Far; 
      strfmt.LineAlignment = StringAlignment.Far; 

      pea.Graphics.DrawString(DateTime.Now.ToString("F"), 
      Font, new SolidBrush(ForeColor), 
      ClientRectangle, strfmt); 

     } 

     private void getMessage() 
     { 
      while (true) 
      { 
       serverStream = clientSocket.GetStream(); 
       int buffSize = 0; 
       byte[] inStream = new byte[10025]; 
       buffSize = clientSocket.ReceiveBufferSize; 
       serverStream.Read(inStream, 0, buffSize); 
       string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
       readData = "" + returndata; 
       msg(); 
      } 
     } 


     private void msg() 
     { 
      if (this.InvokeRequired) 
       this.Invoke(new MethodInvoker(msg)); 
      else 
       textDisplay.Text = textDisplay.Text + Environment.NewLine + " >> " + readData; 
     } 


     private void buttonConnect_Click(object sender, EventArgs e) 
     { 


      // show the message if no input is enter. 
      if (string.IsNullOrEmpty(textName.Text) || string.IsNullOrEmpty(textPort.Text) || string.IsNullOrEmpty(textIP.Text)) 
      { 
       MessageBox.Show("Please enter Name, IP Address & Port #"); 
      } 
      else 
      { 
       //connect to the server if all 3 input is enter 
       readData = "Conected to NYP Server ..."; 
       msg(); 

       clientSocket.Connect(textIP.Text, Convert.ToInt32(textPort.Text)); 
       serverStream = clientSocket.GetStream(); 

       byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textName.Text + "$"); 
       serverStream.Write(outStream, 0, outStream.Length); 
       serverStream.Flush(); 

       Thread ctThread = new Thread(getMessage); 
       ctThread.Start(); 


      } 
     } 

     private void buttonSend_Click(object sender, EventArgs e) 
     { 
      // Show msg box if no server is connected 
      if (serverStream == null) 
      { 
       MessageBox.Show("Please connect to a server first!"); 
       return; 
      } 

      // Send text 
      byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textSend.Text + "$"); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 

      // Clear text 
      textSend.Text = ""; 

     } 

     private void textDisplay_TextChanged(object sender, EventArgs e) 
     { 
      textDisplay.SelectionStart = textDisplay.Text.Length; 
      textDisplay.ScrollToCaret(); 
      textDisplay.Refresh(); 
     } 

     private void textSend_TextChanged(object sender, EventArgs e) 
     { 
      buttonSend.Enabled = !string.IsNullOrEmpty(textSend.Text); 
     } 
    } 
} 
+1

ध्यान दें कि .NET Framework ने .NET Framework Design दिशानिर्देशों में से एक का उल्लंघन किया है: सामान्य नाम वाले वर्ग सामान्य उद्देश्य वाले वर्ग होना चाहिए। 'स्ट्रिंग' बनाम 'एक्सएमएलटीक्स्ट रीडर' पर विचार करें। 'टाइमर 'एक सामान्य नाम है, और एक या दोनों कक्षाएं विशिष्ट हैं। –

उत्तर

5
समस्या

आप हैं कि

using System.Windows.Forms; 
using System.Threading; 

इन नामस्थान के दोनों एक Timer वर्ग है और संकलक जो एक का उपयोग करने नहीं बता सकता है। जब आप अपने Timer घोषित, पूरा नाम का उपयोग, या तो:

System.Windows.Forms.Timer 

या

System.Threading.Timer 

WinForms Timer Class

Threading Timer Class

वर्ग के अपने उपयोग के आधार पर, मुझे लगता है कि आप चाहते हैं System.Windows.Forms.Timer, जैसे:

public SocketClient() 
    { 
     InitializeComponent(); 
     var timer = new System.Windows.Forms.Timer(); 
     timer.Tick += new EventHandler(TimerOnTick); 
     timer.Interval = 1000; 
     timer.Start(); 
    } 
29

वहाँ विभिन्न विकल्प यहाँ हैं:

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
  • एक namespace उर्फ ​​उपयोग::

    पूरी तरह से योग्य नाम
    using UITimer = System.Windows.Forms.Timer; 
    
    ... 
    UITimer timer = new UITimer(); 
    
  • उपयोग:

    • एक उपनाम का प्रयोग करें

      using WinForms = System.Windows.Forms; 
      ... 
      WinForms::Timer timer = new WinForms::Timer(); 
      

    हालांकि, मैं व्यक्तिगत रूप से विभाजित नेटवर्क कोड से यूजर इंटरफेस कोड सुझाव है - जिस पर यह एक मुद्दा होने की संभावना नहीं है इशारा करते हैं।

    मैं यह भी ध्यान दूंगा कि आप वर्तमान में वापसी मूल्य को बिना खाते में पढ़ रहे हैं - यह एक बुरा विचार है, क्योंकि आप नहीं जानते कि बफर में वास्तव में कितना नया डेटा है।

  • +0

    पूरी तरह से अलियासिंग के बारे में भूल गया, मूर्ख मुझे! – Sapph

    +0

    यह उत्तर स्वीकार्य उत्तर क्यों नहीं है? – Liban

    संबंधित मुद्दे