using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace test3
{
public delegate void UpdateList(string sIP, string sHostName); public partial class Form1 : Form
{
private System.DateTime StartTime; public Form1()
{
InitializeComponent();
}
//封装
public class ping
{
public UpdateList UL;
public string IP;
private MethodInvoker MI;
//定义一个变量,用以接收传送来的IP地址字符串
public string HostName;
//定义一个变量,用以向主进展传递对应IP地址是否在线数据
public void scan()
{
IPAddress myIP = IPAddress.Parse(IP);
try
{
//IPHostEntry myHost = Dns.GetHostByAddress(myIP);
IPHostEntry myHost = Dns.GetHostEntry(myIP);
string HostName = myHost.HostName.ToString();
}
catch
{
HostName = "";
}
if (HostName == "")
HostName = "主机没有响应!";
if (UL != null)
UL(IP,HostName);
}
//定义一个过程(也可以看出方法),用以判断传送来的IP地址对应计算机是否在线
} void UpdateMyList(string sIP, string sHostName)
{
MethodInvoker MI = new MethodInvoker(HostPing.scan);
this.BeginInvoke(MI);
lock (listBox1)
{
listBox1.Items.Add(sIP + "" + sHostName);
if (progressBar1.Value != progressBar1.Maximum)
{
progressBar1.Value++;
}
if (progressBar1.Value == progressBar1.Maximum)
{
MessageBox.Show("成功完成检测!","提示");
DateTime EndTime = DateTime.Now;
TimeSpan TS = EndTime - StartTime;
label4.Text = TS.Seconds.ToString() + "秒";
//显示扫描计算机所需要的时间 progressBar1.Value = progressBar1.Minimum;
}
}
} #region invoke /// <summary>
/// Delegate function to be invoked by main thread
/// </summary>
private void InvokeFun()
{
if (progressBar1.Value < progressBar1.Maximum)
progressBar1.Value = progressBar1.Value + 1;
} /// <summary>
/// Thread function interface
/// </summary>
private void ThreadFun()
{
//Create invoke method by specific function
MethodInvoker mi = new MethodInvoker(this.InvokeFun); for (int i = 0; i < progressBar1.Maximum; i++)
{
this.BeginInvoke(mi);
Thread.Sleep(progressBar1.Maximum);
}
} #endregion public ping HostPing = new ping();
private void button1_Click(object sender, EventArgs e)
{
#region 未用多线程处理的代码 //listBox1.Items.Clear();
////清楚扫描显示区域
//StartTime = DateTime.Now;
////获取当前时间
//string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
//int Min = (int)numericUpDown4.Value;
//int Max = (int)numericUpDown5.Value;
//int i;
//for (i = Min; i <= Max; i++)
//{
// string ip = mask + i.ToString();
// IPAddress myIP = IPAddress.Parse(ip);
// //根据给定的IP地址字符串,处境IPAddress实例
// try
// {
// IPHostEntry myHost = Dns.GetHostByAddress(myIP);
// string HostName = myHost.HostName.ToString();
// listBox1.Items.Add(ip + "名称为:" + HostName);
// }
// catch
// {
// listBox1.Items.Add(ip + "主机没有响应!");
// }
// progressBar1.Value = i;
//}
////扫描给定IP对应的计算机是否在线
//DateTime EndTime = DateTime.Now;
//TimeSpan TS = EndTime - StartTime;
////获得扫描网络计算机所用的时间
//label4.Text = TS.Seconds.ToString() + "秒";
//label4.Visible = true;
//MessageBox.Show("成功完成检测!", "提示");
//progressBar1.Value = Min; #endregion #region 使用多线程处理的代码 listBox1.Items.Clear();
//清楚扫描显示区域 StartTime = DateTime.Now;
//获取当前时间 string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
int Min = (int)numericUpDown4.Value;
int Max = (int)numericUpDown5.Value;
if (Min > Max)
{
MessageBox.Show("输入的IP地址区间不合法,请检查!", "错误!");
return;
}
//判断输入的IP地址区间是否合法 int ThreadNum = Max - Min + 1;
Thread[] myThread = new Thread[ThreadNum];
//创建一个多线程的实例 progressBar1.Minimum = Min;
progressBar1.Maximum = Max + 1;
progressBar1.Value = Min;
int i;
//MethodInvoker MI;
for (i = Min; i <= Max; i++)
{
int k = Max - i;
//ping HostPing = new ping();
////创建一个ping实例 //MI = new MethodInvoker(HostPing.scan);
//this.BeginInvoke(MI);
HostPing.IP = mask + i.ToString();
HostPing.UL = new UpdateList(UpdateMyList);
//向这个ping实例中传递IP地址字符串 myThread[k] = new Thread(new ThreadStart(HostPing.scan));
//初始化一个线程实例 myThread[k].Start();
//启动线程
} //for (i = Min; i <= ThreadNum; i++)
//{
// Thread.Sleep(i);
//} #endregion
} private void Form1_Load(object sender, EventArgs e)
{
label4.Visible = false;
}
}
}原文是在http://www.itepub.net/html/article/bianchengkaifa/cnetok/wangluobiancheng/2006/0428/2162.html
我想该成在.net2005里运行的程序,但是总是提示:Cross-thread operation not valid
该如何在.net2005中实现多线程呢?invoke语句该放到哪里?如何写?
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;namespace test3
{
public delegate void UpdateList(string sIP, string sHostName); public partial class Form1 : Form
{
private System.DateTime StartTime; public Form1()
{
InitializeComponent();
}
//封装
public class ping
{
public UpdateList UL;
public string IP;
private MethodInvoker MI;
//定义一个变量,用以接收传送来的IP地址字符串
public string HostName;
//定义一个变量,用以向主进展传递对应IP地址是否在线数据
public void scan()
{
IPAddress myIP = IPAddress.Parse(IP);
try
{
//IPHostEntry myHost = Dns.GetHostByAddress(myIP);
IPHostEntry myHost = Dns.GetHostEntry(myIP);
string HostName = myHost.HostName.ToString();
}
catch
{
HostName = "";
}
if (HostName == "")
HostName = "主机没有响应!";
if (UL != null)
UL(IP,HostName);
}
//定义一个过程(也可以看出方法),用以判断传送来的IP地址对应计算机是否在线
} void UpdateMyList(string sIP, string sHostName)
{
MethodInvoker MI = new MethodInvoker(HostPing.scan);
this.BeginInvoke(MI);
lock (listBox1)
{
listBox1.Items.Add(sIP + "" + sHostName);
if (progressBar1.Value != progressBar1.Maximum)
{
progressBar1.Value++;
}
if (progressBar1.Value == progressBar1.Maximum)
{
MessageBox.Show("成功完成检测!","提示");
DateTime EndTime = DateTime.Now;
TimeSpan TS = EndTime - StartTime;
label4.Text = TS.Seconds.ToString() + "秒";
//显示扫描计算机所需要的时间 progressBar1.Value = progressBar1.Minimum;
}
}
} #region invoke /// <summary>
/// Delegate function to be invoked by main thread
/// </summary>
private void InvokeFun()
{
if (progressBar1.Value < progressBar1.Maximum)
progressBar1.Value = progressBar1.Value + 1;
} /// <summary>
/// Thread function interface
/// </summary>
private void ThreadFun()
{
//Create invoke method by specific function
MethodInvoker mi = new MethodInvoker(this.InvokeFun); for (int i = 0; i < progressBar1.Maximum; i++)
{
this.BeginInvoke(mi);
Thread.Sleep(progressBar1.Maximum);
}
} #endregion public ping HostPing = new ping();
private void button1_Click(object sender, EventArgs e)
{
#region 未用多线程处理的代码 //listBox1.Items.Clear();
////清楚扫描显示区域
//StartTime = DateTime.Now;
////获取当前时间
//string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
//int Min = (int)numericUpDown4.Value;
//int Max = (int)numericUpDown5.Value;
//int i;
//for (i = Min; i <= Max; i++)
//{
// string ip = mask + i.ToString();
// IPAddress myIP = IPAddress.Parse(ip);
// //根据给定的IP地址字符串,处境IPAddress实例
// try
// {
// IPHostEntry myHost = Dns.GetHostByAddress(myIP);
// string HostName = myHost.HostName.ToString();
// listBox1.Items.Add(ip + "名称为:" + HostName);
// }
// catch
// {
// listBox1.Items.Add(ip + "主机没有响应!");
// }
// progressBar1.Value = i;
//}
////扫描给定IP对应的计算机是否在线
//DateTime EndTime = DateTime.Now;
//TimeSpan TS = EndTime - StartTime;
////获得扫描网络计算机所用的时间
//label4.Text = TS.Seconds.ToString() + "秒";
//label4.Visible = true;
//MessageBox.Show("成功完成检测!", "提示");
//progressBar1.Value = Min; #endregion #region 使用多线程处理的代码 listBox1.Items.Clear();
//清楚扫描显示区域 StartTime = DateTime.Now;
//获取当前时间 string mask = numericUpDown1.Value.ToString() + "." + numericUpDown2.Value.ToString() + "." + numericUpDown3.Value.ToString() + ".";
int Min = (int)numericUpDown4.Value;
int Max = (int)numericUpDown5.Value;
if (Min > Max)
{
MessageBox.Show("输入的IP地址区间不合法,请检查!", "错误!");
return;
}
//判断输入的IP地址区间是否合法 int ThreadNum = Max - Min + 1;
Thread[] myThread = new Thread[ThreadNum];
//创建一个多线程的实例 progressBar1.Minimum = Min;
progressBar1.Maximum = Max + 1;
progressBar1.Value = Min;
int i;
//MethodInvoker MI;
for (i = Min; i <= Max; i++)
{
int k = Max - i;
//ping HostPing = new ping();
////创建一个ping实例 //MI = new MethodInvoker(HostPing.scan);
//this.BeginInvoke(MI);
HostPing.IP = mask + i.ToString();
HostPing.UL = new UpdateList(UpdateMyList);
//向这个ping实例中传递IP地址字符串 myThread[k] = new Thread(new ThreadStart(HostPing.scan));
//初始化一个线程实例 myThread[k].Start();
//启动线程
} //for (i = Min; i <= ThreadNum; i++)
//{
// Thread.Sleep(i);
//} #endregion
} private void Form1_Load(object sender, EventArgs e)
{
label4.Visible = false;
}
}
}原文是在http://www.itepub.net/html/article/bianchengkaifa/cnetok/wangluobiancheng/2006/0428/2162.html
我想该成在.net2005里运行的程序,但是总是提示:Cross-thread operation not valid
该如何在.net2005中实现多线程呢?invoke语句该放到哪里?如何写?
解决方案 »
- .vshost.exe的一个问题
- WinCE 下面如何用C#调用 window media player
- 紧急高分求助:请问如何给一个项目中的Program.cs中main方法传参args[]?
- iframe自适应高度的问题,特殊情况,大家指点一下。
- 如何在一个Form下作出自定义事件的反应,Form线程的问题?
- winform下鼠标点击一次值++事件
- Management的问题,怪
- 我在一个windows from 上画了一条直线,请问如何把他打印出来?(帮顶有分)
- xml 解析啊,求大侠们帮忙。。
- 请问这个错误怎么解决,求解答??
- 如何用多线程来实现ping多台机器?
- 判断需要用那个方法来响应与WEB交互时产生的事件 ??中的方法可以具体的理解为??AutoEventWireup="true"此时如果在VS中加入委托的话,
既然提示跨线程操作无效...很可能是调用UI控件的时候没有用BeginInvoke()...
void UpdateMyList(string sIP, string sHostName)
{
MethodInvoker MI = new MethodInvoker(HostPing.scan);
this.BeginInvoke(MI);
lock (listBox1)
{
listBox1.Items.Add(sIP + "" + sHostName);
if (progressBar1.Value != progressBar1.Maximum)
{
progressBar1.Value++;
}
if (progressBar1.Value == progressBar1.Maximum)
{
MessageBox.Show("成功完成检测!","提示");
DateTime EndTime = DateTime.Now;
TimeSpan TS = EndTime - StartTime;
label4.Text = TS.Seconds.ToString() + "秒";
//显示扫描计算机所需要的时间
progressBar1.Value = progressBar1.Minimum;
}
} 这里会总是提示listview1控件跨线程操作出错,不知道怎么改整个程序,求助……
给你个例子吧,这是M$上的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;using System.Threading;namespace Updating_UI_Controls
{
public partial class Form1 : Form
{
private bool processingDone;
private Thread myWorkerThread; public Form1()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
processingDone = true;
myWorkerThread.Join();
button2.Enabled = false;
button1.Enabled = true;
} private void ExecuteProcessing()
{
UpdateLabelDelegate labelUpdater = new UpdateLabelDelegate(UpdateLabel);
this.Invoke(labelUpdater, new object[]{"Processing: Active", Color.Red});
// label1.Text = "Processing: Active";
// label1.ForeColor = Color.Red; try
{
while (!processingDone)
{
Thread.Sleep(0);
// this.Invoke(labelUpdater, new object[] { "Processing: Still Active - " + DateTime.Now, Color.Green });
this.BeginInvoke(labelUpdater, new object[] { "Processing: Still Active - " + DateTime.Now, Color.Green });
// label1.Text = "Processing: Still Active - " + DateTime.Now;
// label1.ForeColor = Color.Green;
}
}
finally
{
Thread.Sleep(1000);
// this.Invoke(labelUpdater, new object[] { "Processing: Done", Color.Black });
this.BeginInvoke(labelUpdater, new object[] { "Processing: Done", Color.Black });
// label1.Text = "Processing: Done";
// label1.ForeColor = Color.Black;
}
} delegate void UpdateLabelDelegate(string labelText, Color textColor);
private void UpdateLabel(string labelText, Color textColor)
{
label1.Text = labelText;
label1.ForeColor = textColor;
} private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
button2.Enabled = true;
processingDone = false; myWorkerThread = new Thread(new ThreadStart(ExecuteProcessing));
myWorkerThread.Start();
}
}
}
http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242374