多线程方面 用多线程实现一个程序可以同时运行多个方法 多线程在程序中怎么处理 代码怎么实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public void AA(){}public void BB(){}public void CC(){}Thread thread=new Thread(AA);thread.Start();Thread thread=new Thread(BB);thread.Start();Thread thread=new Thread(CC);thread.Start();或者用委托 http://www.cnblogs.com/luminji/archive/2010/09/17/1829333.html 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 多线程的不利方面:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。 任何程序在执行时,至少有一个主线程。一个直观印象的线程示例://SystemThread.csusing System;using System.Threading; namespace ThreadTest{ class RunIt { [STAThread] static void Main(string[] args) { Thread.CurrentThread.Name="System Thread";//给当前线程起名为"System Thread" Console.WriteLine(Thread.CurrentThread.Name+"'Status:"+Thread.CurrentThread.ThreadState); Console.ReadLine(); } }}输出如下: System Thread's Status:Running 在这里,我们通过Thread类的静态属性CurrentThread获取了当前执行的线程,对其Name属性赋值“System Thread”,最后还输出了它的当前状态(ThreadState)。所谓静态属性,就是这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。很容易理解CurrentThread为什么是静态的——虽然有多个线程同时存在,但是在某一个时刻,CPU只能执行其中一个。 在程序的头部,我们使用了如下命名空间: using System; using System.Threading; 在.net framework class library中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。如果你想在你的应用程序中使用多线程,就必须包含这个类。我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。(此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)Thread类有几个至关重要的方法,描述如下:Start():启动线程;Sleep(int):静态方法,暂停当前线程指定的毫秒数; Abort():通常使用该方法来终止一个线程;Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复; Resume():恢复被Suspend()方法挂起的线程的执行; 页面一个Label,一个Button,一个ListBox 共三个控件delegate void BindList(string value); delegate void ChangeLabel(string text); List<string> ips = new List<string>(); int num = 0; private void EnumComputers() { try { for(int i = 1; i <= 255; i++) { Ping myPing; myPing = new Ping(); myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted); string pingIP = "192.168.0." + i.ToString(); myPing.SendAsync(pingIP, 1000, null); } } catch { } } void myPing_PingCompleted(object sender, PingCompletedEventArgs e) { num++; if(e.Reply.Status == IPStatus.Success) { string value = e.Reply.Address.ToString(); ListBind(value); // + "|" + Dns.GetHostByAddress(IPAddress.Parse(e.Reply.Address.ToString())).HostName); if(!ips.Contains(value)) ips.Add(value); } if(num == 255) ipt.Abort();//使用完毕,关闭线程 } /// <summary> /// 对窗体控件 线程安全调用 /// </summary> /// <param name="value"></param> private void ListBind(string value) { if(listBox1.InvokeRequired) { BindList bl = new BindList(ListBind); this.Invoke(bl, new object[] { value }); } else { if(!this.listBox1.Items.Contains(value)) this.listBox1.Items.Add(value); } } Thread ipt = null; Thread showCount = null; private void buttonX1_Click(object sender, EventArgs e) { num = 0; ips.Clear(); listBox1.Items.Clear(); ipt = new Thread(new ThreadStart(EnumComputers)); ipt.Start(); showCount = new Thread(new ThreadStart(ShowDataCount)); showCount.Start(); } private void ShowDataCount() { do { if(num == 255) { ChanageText(ips.Count.ToString() + "----" + listBox1.Items.Count.ToString()); showCount.Abort();//使用完毕关闭线程 } } while(num <= 255); } /// <summary> /// 对窗体控件 线程安全调用 /// </summary> /// <param name="text"></param> private void ChanageText(string text) { if(labelX1.InvokeRequired) { ChangeLabel cl = new ChangeLabel(ChanageText); this.Invoke(cl, new object[] { text }); } else { this.labelX1.Text = text; } } private void GetIp_FormClosing(object sender, FormClosingEventArgs e) { this.Dispose(true);//关闭页面前清理正在使用的资源 } C#连接access数据库时转换出错! windowsMobile短信 webbrowser.document为空? 该字符串未被识别为有效的 DateTime 显示问题 一个文件上传到多台服务器上(高手请进) 菜鸟问题-DataGrid/数据集与SQL Server中的uniqueidentifier或timestamp数据类型 asp.net(c#)的树 刚接触C#不久,请问一下各位用它做啥软件。优点何在,谈谈自己的感想。 请问.NET的三层体系结构是什么? 哪位有具体代码? 当 IDENTITY_INSERT 设置为 ON 时,必须指定表 'T1' 中标识列的显式值。 c# 截取数据
public void BB(){}
public void CC(){}
Thread thread=new Thread(AA);
thread.Start();
Thread thread=new Thread(BB);
thread.Start();
Thread thread=new Thread(CC);
thread.Start();
或者用委托
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。
而一个进程又是由多个线程所组成的。什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。 任何程序在执行时,至少有一个主线程。一个直观印象的线程示例://SystemThread.cs
using System;
using System.Threading; namespace ThreadTest
{
class RunIt
{
[STAThread]
static void Main(string[] args)
{
Thread.CurrentThread.Name="System Thread";//给当前线程起名为"System Thread"
Console.WriteLine(Thread.CurrentThread.Name+"'Status:"+Thread.CurrentThread.ThreadState);
Console.ReadLine();
}
}
}输出如下:
System Thread's Status:Running 在这里,我们通过Thread类的静态属性CurrentThread获取了当前执行的线程,对其Name属性赋值“System Thread”,最后还输出了它的当前状态(ThreadState)。所谓静态属性,就是这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。很容易理解CurrentThread为什么是静态的——虽然有多个线程同时存在,但是在某一个时刻,CPU只能执行其中一个。 在程序的头部,我们使用了如下命名空间:
using System;
using System.Threading; 在.net framework class library中,所有与多线程机制应用相关的类都是放在System.Threading命名空间中的。如果你想在你的应用程序中使用多线程,就必须包含这个类。我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。
(此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)Thread类有几个至关重要的方法,描述如下:
Start():启动线程;
Sleep(int):静态方法,暂停当前线程指定的毫秒数;
Abort():通常使用该方法来终止一个线程;
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;
Resume():恢复被Suspend()方法挂起的线程的执行;
delegate void ChangeLabel(string text);
List<string> ips = new List<string>();
int num = 0;
private void EnumComputers()
{
try
{
for(int i = 1; i <= 255; i++)
{
Ping myPing;
myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted); string pingIP = "192.168.0." + i.ToString();
myPing.SendAsync(pingIP, 1000, null);
}
}
catch
{
}
} void myPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
num++;
if(e.Reply.Status == IPStatus.Success)
{
string value = e.Reply.Address.ToString();
ListBind(value);
// + "|" + Dns.GetHostByAddress(IPAddress.Parse(e.Reply.Address.ToString())).HostName);
if(!ips.Contains(value))
ips.Add(value);
}
if(num == 255)
ipt.Abort();//使用完毕,关闭线程
} /// <summary>
/// 对窗体控件 线程安全调用
/// </summary>
/// <param name="value"></param>
private void ListBind(string value)
{
if(listBox1.InvokeRequired)
{
BindList bl = new BindList(ListBind);
this.Invoke(bl, new object[] { value });
}
else
{
if(!this.listBox1.Items.Contains(value))
this.listBox1.Items.Add(value);
}
}
Thread ipt = null;
Thread showCount = null;
private void buttonX1_Click(object sender, EventArgs e)
{
num = 0;
ips.Clear();
listBox1.Items.Clear();
ipt = new Thread(new ThreadStart(EnumComputers));
ipt.Start();
showCount = new Thread(new ThreadStart(ShowDataCount));
showCount.Start();
} private void ShowDataCount()
{
do
{
if(num == 255)
{
ChanageText(ips.Count.ToString() + "----" + listBox1.Items.Count.ToString());
showCount.Abort();//使用完毕关闭线程
}
} while(num <= 255);
} /// <summary>
/// 对窗体控件 线程安全调用
/// </summary>
/// <param name="text"></param>
private void ChanageText(string text)
{
if(labelX1.InvokeRequired)
{
ChangeLabel cl = new ChangeLabel(ChanageText);
this.Invoke(cl, new object[] { text });
}
else
{
this.labelX1.Text = text;
}
} private void GetIp_FormClosing(object sender, FormClosingEventArgs e)
{
this.Dispose(true);//关闭页面前清理正在使用的资源
}