namespace WindowsApplication1
{
public partial class Form1 : Form
{
static Socket serverSock;
static AsyncCallback receiveCallback;
static byte[] buff;
static EndPoint senderIP;
delegate void OnReceiveplayer(string text);
static int count=0;
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//异步
buff = new byte[1024];
senderIP = new IPEndPoint(IPAddress.Any, 0); receiveCallback = new AsyncCallback(OnDataReceived); serverSock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
serverSock.Bind(new IPEndPoint(IPAddress.Any, 9050));
serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock); //Console.ReadLine();
} private void button1_Click(object sender, EventArgs e)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
//IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
//string hostname = Dns.GetHostName();
string sendmsg = "005003,005,45-45-54-54-ac-4A,online";
byte[] data = Encoding.UTF8.GetBytes(sendmsg);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
sock.SendTo(data, iep1);
//sock.SendTo(data, iep2);
sock.Close(); }
private void OnDataReceived(IAsyncResult ar)
{
Socket udpSocket = ar.AsyncState as Socket;
int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)senderIP); //Console.WriteLine("{0}传来消息{1} ", senderIP.ToString(), System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved));
//MessageBox.Show("{0}传来消息{1} "+ senderIP.ToString() +" "+ System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved)); this.OnReceiveplayerd(System.Text.Encoding.UTF8.GetString(buff, 0, bytesRecved)); serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock);
}
private void OnReceiveplayerd(string text)
{
//listView1.Items.Clear();
if (this.listView1.InvokeRequired)
{
OnReceiveplayer d = new OnReceiveplayer(OnReceiveplayerd);
this.Invoke(d, new object[] { text });
}
else
{
//分割收到的信息
count++;
string[] tmpstr = text.Split(',');
if (tmpstr.Length == 4)
{
ListViewItem li1 = new ListViewItem();
li1.SubItems[0].Text = tmpstr[0];
li1.SubItems.Add(tmpstr[1]);
li1.SubItems.Add(tmpstr[2]);
li1.SubItems.Add(tmpstr[3]);
listView1.Items.Add(li1);
}
else
{
ListViewItem li1 = new ListViewItem();
li1.SubItems[0].Text = tmpstr[0];
listView1.Items.Add(li1);
}
label1.Text = count.ToString();
}
}
private void buttonGetIndices_Click(object sender, EventArgs e)
{
System.Timers.Timer t = new System.Timers.Timer(1000);
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.AutoReset = true;
t.Enabled = true;
//listView1.CheckedIndices
} void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{ int num = 0;
foreach (ListViewItem item in listView1.Items)
{
if ((item != null) && item.Selected)
{
num++;
}
}
//return num;
MessageBox.Show("");
}
//System.Windows.Forms.ListView.CheckedIndexCollection checked_indices = (System.Windows.Forms.ListView.CheckedIndexCollection)listView1.Invoke(new cichandler(ToGetCheckedIndices));//ok
delegate System.Windows.Forms.ListView.CheckedIndexCollection cichandler();
System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices() {
if (listView1.InvokeRequired)
{
cichandler cic = new cichandler(ToGetCheckedIndices);
cic.Invoke();
}
return listView1.CheckedIndices;
} delegate int GetCheckedCountHandler();
int GetCheckedCount() {
/* int count = new GetCheckedCountHandler(GetCheckedCount).Invoke();
throw: 未处理 System.StackOverflowException
*/
if (listView1.InvokeRequired)
{
GetCheckedCountHandler counter = new GetCheckedCountHandler(GetCheckedCount);
counter.Invoke();
} return listView1.CheckedIndices.Count ;
}
public int CheckedIndicesCount(ListView lv)
{ if (!lv.CheckBoxes)
{
return 0;
}
int num = 0;
foreach (ListViewItem item in lv.Items)
{
if ((item != null) && item.Checked)
{
num++;
}
}
return num;
}
delegate int SelectedIndicesHandler(ListView listview);
public int SelectedIndicesCount(ListView lv)
{
if (lv.InvokeRequired) {
SelectedIndicesHandler selectedhandler = new SelectedIndicesHandler(SelectedIndicesCount);
selectedhandler.Invoke(lv);
} int num = 0;
foreach (ListViewItem item in lv.Items)
{
if ((item != null) && item.Selected)
{
num++;
}
}
return num;
}
delegate ListView.ListViewItemCollection ListViewItemsHandler(ListView listview);
ListView.ListViewItemCollection ListViewItems(ListView lv) {
if (lv.InvokeRequired) {
/* System.StackOverflowException
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
ListView.ListViewItemCollection items = getitems.Invoke(listView1);
*/
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
getitems.Invoke (lv);
}
return lv.Items;
}
}
}简单说就是解决invoke时产生StackOverflowException
{
public partial class Form1 : Form
{
static Socket serverSock;
static AsyncCallback receiveCallback;
static byte[] buff;
static EndPoint senderIP;
delegate void OnReceiveplayer(string text);
static int count=0;
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//异步
buff = new byte[1024];
senderIP = new IPEndPoint(IPAddress.Any, 0); receiveCallback = new AsyncCallback(OnDataReceived); serverSock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
serverSock.Bind(new IPEndPoint(IPAddress.Any, 9050));
serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock); //Console.ReadLine();
} private void button1_Click(object sender, EventArgs e)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
//IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
//string hostname = Dns.GetHostName();
string sendmsg = "005003,005,45-45-54-54-ac-4A,online";
byte[] data = Encoding.UTF8.GetBytes(sendmsg);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
sock.SendTo(data, iep1);
//sock.SendTo(data, iep2);
sock.Close(); }
private void OnDataReceived(IAsyncResult ar)
{
Socket udpSocket = ar.AsyncState as Socket;
int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)senderIP); //Console.WriteLine("{0}传来消息{1} ", senderIP.ToString(), System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved));
//MessageBox.Show("{0}传来消息{1} "+ senderIP.ToString() +" "+ System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved)); this.OnReceiveplayerd(System.Text.Encoding.UTF8.GetString(buff, 0, bytesRecved)); serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
ref senderIP, receiveCallback, serverSock);
}
private void OnReceiveplayerd(string text)
{
//listView1.Items.Clear();
if (this.listView1.InvokeRequired)
{
OnReceiveplayer d = new OnReceiveplayer(OnReceiveplayerd);
this.Invoke(d, new object[] { text });
}
else
{
//分割收到的信息
count++;
string[] tmpstr = text.Split(',');
if (tmpstr.Length == 4)
{
ListViewItem li1 = new ListViewItem();
li1.SubItems[0].Text = tmpstr[0];
li1.SubItems.Add(tmpstr[1]);
li1.SubItems.Add(tmpstr[2]);
li1.SubItems.Add(tmpstr[3]);
listView1.Items.Add(li1);
}
else
{
ListViewItem li1 = new ListViewItem();
li1.SubItems[0].Text = tmpstr[0];
listView1.Items.Add(li1);
}
label1.Text = count.ToString();
}
}
private void buttonGetIndices_Click(object sender, EventArgs e)
{
System.Timers.Timer t = new System.Timers.Timer(1000);
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.AutoReset = true;
t.Enabled = true;
//listView1.CheckedIndices
} void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{ int num = 0;
foreach (ListViewItem item in listView1.Items)
{
if ((item != null) && item.Selected)
{
num++;
}
}
//return num;
MessageBox.Show("");
}
//System.Windows.Forms.ListView.CheckedIndexCollection checked_indices = (System.Windows.Forms.ListView.CheckedIndexCollection)listView1.Invoke(new cichandler(ToGetCheckedIndices));//ok
delegate System.Windows.Forms.ListView.CheckedIndexCollection cichandler();
System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices() {
if (listView1.InvokeRequired)
{
cichandler cic = new cichandler(ToGetCheckedIndices);
cic.Invoke();
}
return listView1.CheckedIndices;
} delegate int GetCheckedCountHandler();
int GetCheckedCount() {
/* int count = new GetCheckedCountHandler(GetCheckedCount).Invoke();
throw: 未处理 System.StackOverflowException
*/
if (listView1.InvokeRequired)
{
GetCheckedCountHandler counter = new GetCheckedCountHandler(GetCheckedCount);
counter.Invoke();
} return listView1.CheckedIndices.Count ;
}
public int CheckedIndicesCount(ListView lv)
{ if (!lv.CheckBoxes)
{
return 0;
}
int num = 0;
foreach (ListViewItem item in lv.Items)
{
if ((item != null) && item.Checked)
{
num++;
}
}
return num;
}
delegate int SelectedIndicesHandler(ListView listview);
public int SelectedIndicesCount(ListView lv)
{
if (lv.InvokeRequired) {
SelectedIndicesHandler selectedhandler = new SelectedIndicesHandler(SelectedIndicesCount);
selectedhandler.Invoke(lv);
} int num = 0;
foreach (ListViewItem item in lv.Items)
{
if ((item != null) && item.Selected)
{
num++;
}
}
return num;
}
delegate ListView.ListViewItemCollection ListViewItemsHandler(ListView listview);
ListView.ListViewItemCollection ListViewItems(ListView lv) {
if (lv.InvokeRequired) {
/* System.StackOverflowException
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
ListView.ListViewItemCollection items = getitems.Invoke(listView1);
*/
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
getitems.Invoke (lv);
}
return lv.Items;
}
}
}简单说就是解决invoke时产生StackOverflowException
解决方案 »
- 请教,c#查询Excel数据库包含字符
- 关于VSS和vs.net2005
- 如何做个采购订单页面?真的很急-----
- 在c#中sql 的identity值如何重设
- 谁能帮我解析一下这段字符串(正则表达式)
- 水晶报表的详细资料部分显示空行
- 介绍一个提供C#程序例子和源代码的网站给我吧!!!
- SharpDevelop 1.0 发布了,建议各位试用,我觉得相当不错
- winform按下按 钮使 程 序 从 某 一 句 开 始 执 行
- 怎样在OtherForm中得到MainForm类的引用
- 如何将一个窗口的文本框的值传给另一个类的变量
- C#对windows系统日志操作(对日志的查看删除 和保护(恢复与备份)) .net2.0框架下
{
ListView listView1 = null;
if (listView1.InvokeRequired)
{
cichandler cic = new cichandler(ToGetCheckedIndices);
return cic.Invoke();
}
return listView1.CheckedIndices;
}
int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)senderIP);
中的
ref (EndPoint)senderIP
不能通过吧???
{
ListView listView1 = null;
if (listView1.InvokeRequired)
{
cichandler cic = new cichandler(ToGetCheckedIndices);
return cic.Invoke();
}
return listView1.CheckedIndices;
}
------------------------------------
return cic.Invoke(); 貌似不用
我运行时能获得结果,必须把程序跑起来,就是在委托调用是出现 System.StackOverflowException
奇怪的问题
反编译.net类库,ListView.ListViewItemCollection ListView的Items属性确实有个循环
{
if (listView1.InvokeRequired)
{
cichandler cic = new cichandler(ToGetCheckedIndices);
//cic.Invoke();
return listView1.Invoke(cic); //<---
}
return listView1.CheckedIndices;
}:) 主体错了,要用Control.Invoke来送到Control所在的UI线程执行。
delegate int IndicesHandler(ListView listview);
public int SelectedIndicesCount(ListView lv)
{
if (lv.InvokeRequired)
{
IndicesHandler handler = new IndicesHandler(SelectedIndicesCount);
return (int)lv.Invoke(handler, new object[] { lv });
}
ListViewItemsHandler itemshandler=new ListViewItemsHandler (ListViewItems);
ListView.ListViewItemCollection Items = itemshandler.Invoke(lv);
int num = 0;
foreach (ListViewItem item in Items)//lv.Items)
{
if ((item != null) && item.Checked)//Selected)
{
num++;
}
}
return num;
} delegate ListView.ListViewItemCollection ListViewItemsHandler(ListView listview);
ListView.ListViewItemCollection ListViewItems(ListView lv)
{
if (lv.InvokeRequired)
{
/* System.StackOverflowException
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
ListView.ListViewItemCollection items = getitems.Invoke(listView1);
*/
ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
return (ListView.ListViewItemCollection)lv.Invoke(getitems, new object[] { lv });
}
return lv.Items;
}正解
给分!