2010-01-22 33 views
9

tôi có lỗi hiển thị: Lỗi trên 'hẹn giờ' là một tham chiếu mơ hồ giữa 'System.Windows.Forms.Timer' và 'System.Threading.Timer'

 
'Timer' is an ambiguous reference between 'System.Windows.Forms.Timer' and 'System.Threading.Timer' 
khi tôi thêm mã cho đồng hồ

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

Lưu ý rằng Khuôn khổ .NET đã vi phạm một trong các Nguyên tắc Thiết kế Khuôn khổ .NET: các lớp có tên chung phải là các lớp có mục đích chung. Xem xét 'Chuỗi' so với' XmlTextReader'. 'Timer' là một tên chung, và một hoặc cả hai lớp là chuyên biệt. –

Trả lời

5

vấn đề là bạn có

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

Cả hai không gian tên có một lớp Timer và trình biên dịch không thể nói cái nào để sử dụng. Khi bạn khai báo Timer của bạn, sử dụng tên đầy đủ, hoặc là:

System.Windows.Forms.Timer 

hoặc

System.Threading.Timer 

WinForms Timer Class

Threading Timer Class

Dựa vào cách sử dụng của bạn của lớp, tôi nghĩ rằng bạn muốn System.Windows.Forms.Timer, giống như vậy:

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

Có những lựa chọn khác nhau ở đây:

  • Sử dụng một bí danh:

    using UITimer = System.Windows.Forms.Timer; 
    
    ... 
    UITimer timer = new UITimer(); 
    
  • Sử dụng tên đầy đủ:

    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
    
  • Sử dụng một bí danh namespace:

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

Tuy nhiên, cá nhân tôi sẽ đề nghị tách lên các mã giao diện người dùng từ các mã mạng - lúc này nó khó có thể là một vấn đề. Tôi cũng xin lưu ý rằng bạn hiện đang đọc từ luồng mà không tính đến giá trị trả về - đó là một ý tưởng tồi, vì bạn không biết số lượng bộ đệm thực sự chứa dữ liệu mới là như thế nào.

+0

Hoàn toàn quên về bí danh, ngớ ngẩn tôi! – Sapph

+0

tại sao câu trả lời này không phải là câu trả lời được chấp nhận? – Liban

Các vấn đề liên quan