作者pttmimic (烦烦烦..)
看板C_Sharp
标题Re: [问题] 两个类别间如何相互引发事件?
时间Thu Aug 23 12:05:03 2007
※ 引述《pttmimic (烦烦烦..)》之铭言:
: 推 horngsh:找本好书, 看有关Event and Delegate章节..应该会有帮助.. 08/22 18:04
: 推 dreamcryer:MSDN关於这部份的说明和范例也很足够
谢谢各位的推文,但是我目前可以找到关於事件的部分,都是一个类别专为publiser
而另一个类别专为subscriber,这样作起来比较没问题,可是我二个类别都同时具有
Publisher/Subscriber的身份,并互相产生反应。
我想可能只用文字叙述可能不够清楚,我改了一个比较简化的程式码,希望不要太占版面
using System;
using System.Net;
using System.Net.Sockets;
using System.Drawing;
using System.Windows.Forms;
namespace TestProject
{
//介面类别
public class frmMain : Form
{
//定义frmStart事件
public event EventHandler onfrmStart;
private Button btnStart;
private TextBox txtDisplay;
//public frmMain()
public frmMain(SoftID IDsoft)
{
InitializeComponent();
//监听IDsoft类别是否有在 PORT8888收到封包
IDsoft.onReceive += new ReceiveEventHandler (this.onAddNewMessage);
}
//表单元件初始化
private void InitializeComponent()
{
//使用工具产生,所以省略.......
}
private void btnStart_Click(object sender, System.EventArgs e)
{
this.btnStart.Enabled = false;
if(onfrmStart != null)
{
//丢出按下Listen button事件
onfrmStart(this,e);
}
}
//当收到IDsoft的事件时所作的处理
public void onAddNewMessage(string Message)
{
this.txtDisplay.Text += Message + "\r\n";
this.btnStart.Enabled = true;
this.Refresh();
}
}
//PORT监听类别
public delegate void ReceiveEventHandler(string Message);
public class SoftID
{
private TcpListener x_listener;
private TcpClient x_client;
public event ReceiveEventHandler onReceive;
public SoftID(frmMain newWins)
{
//监听frmMain是否按下"Listen button
newWins.onfrmStart += new EventHandler(this.Listen);
}
public void Listen(object sender,EventArgs e)
{
String data = "";
string txtLocalIP = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
x_listener = new TcpListener(IPAddress.Parse(txtLocalIP),8888);
try
{
x_listener.Start();
while(!x_listener.Pending())
{
x_client = x_listener.AcceptTcpClient();
//接收自客户端的讯息
NetworkStream ns = x_client.GetStream();
Byte[] bytes = new Byte[1024];
Int32 i = ns.Read(bytes, 0, bytes.Length);
ns.Close();
x_listener.Stop();
data = System.Text.Encoding.Default.GetString(bytes, 0, i);
//丢出事件
if(onReceive != null )
{
onReceive(data);
}
}
}
catch (Exception err)
{
MessageBox.Show ("Exception:\r\n" + err.Message );
return;
}
x_listener = null;
}
}
//主类别
public class mymain
{
private static frmMain mainwin = new frmMain(IDsoft);
//private static frmMain mainwin = new frmMain();
private static SoftID IDsoft = new SoftID(mainwin);
static void Main()
{
Application.Run(mainwin);
}
}
}
我可以通过编译,可是执行时会产生以下错误讯息
类型'System.NullReferenceException'的未处理例外状况发生於TestProject
其他资讯 :并未将物件参考设为物件的执行个体
IDE并会停在frmMain 的建构式
IDsoft.onReceive += new ReceiveEventHandler(this.onAddNewMessage)
这一行
程式码看起来很乱,不知道有没有更好的办法,不好意思打扰大家,感恩。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.14.73.3