hata

2010-01-22 11 views
9

hata göstermişlerdir 'System.Windows.Forms.Timer' ve 'System.Threading.Timer' arasında belirsiz bir referans: hata

 
'Timer' is an ambiguous reference between 'System.Windows.Forms.Timer' and 'System.Threading.Timer' 
I saat için kod ilave edildiği zaman

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'ün .NET Framework Tasarım Yönergeleri'nden birini ihlal ettiğini unutmayın: genel adlara sahip sınıfların genel amaçlı sınıflar olması gerekir. 'String' vs' XmlTextReader 'düşünün. Timer, genel bir addır ve sınıfların biri veya her ikisi de uzmanlaşmıştır. –

cevap

5

sorun

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

bu ad her ikisi de Timer sınıf var ve derleyici hangisinin kullanılacağını söyleyemem olmasıdır.

System.Windows.Forms.Timer 

veya sınıfın Kullanımınıza göre

System.Threading.Timer 

WinForms Timer Class

Threading Timer Class

, istediğin düşünüyorum: Eğer Timer beyan zaman, ya tam adını kullanmak System.Windows.Forms.Timer, şunun gibi:

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

çeşitli seçenekler burada vardır:

using UITimer = System.Windows.Forms.Timer; 

... 
UITimer timer = new UITimer(); 
  • Kullanım tam adı:

    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
    
  • kullanın ad takma:

    • bir takma ad kullanın

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

    Ancak, ben şahsen ağ kodundan kullanıcı arayüzü kod bölme kadar öneririm - hangi bir sorun olmaya düşüktür etmektedir.

    Ayrıca, şu anda akıştan, dönüş değerini hesaba katmadan okuma yaptığınızı da unutmayın - bu, tamponun ne kadarının yeni veri içerdiğini bilmediğiniz için kötü bir fikirdir.

  • +0

    Takma takmayı tamamen unutmuş, aptal! – Sapph

    +0

    neden bu cevap kabul edilen cevap değil? – Liban