C#学习笔记——进程类
一、进程(Process)
- 我们可以把计算机中每一个运行的应用程序当作是一个进程,而一个进程又是由多个线程组成的。
- 通过进程可以查看电脑进程状况,打开一些电脑可执行应用程序(如:计算器、绘图本等)。
- 注意:
在打开一些非可执行文件时,需要注意自己的环境,如果在.NET Core中,需要将ProcessStartInfo中的UseShellExecute设置为true。而在.NET FrameWork中。该属性默认为true。如不打开,系统会出现如下异常。
- UseShellExecute的默认设置
using System;
using System.Diagnostics;
namespace 进程类
{
class Program
{
static void Main(string[] args)
{
Process[] pros = Process.GetProcesses();
foreach (var item in pros)
{
//item.Kill();结束所有进程,猛男建议尝试
Console.WriteLine(item);
}
//通过进程打开一些应用程序
Process.Start("calc");//打开计算器
Process.Start("mspaint");//打开绘图本
//打开浏览器
#region 方法一
//ProcessStartInfo psi = new ProcessStartInfo
//{
// FileName = "http://www.baidu.com",
// //在.NET Core中想要打开网页链接需要将此处设为true,因为浏览器并不是可执行文件
// UseShellExecute = true
//};
//Process.Start(psi);
#endregion
#region 方法二 推荐使用
ProcessStartInfo psi = new ProcessStartInfo("http://www.baidu.com");
psi.UseShellExecute = true;
Process.Start(psi);
#endregion
#region 方法三
//ProcessStartInfo psi = new ProcessStartInfo("msedge", "http://www.baidu.com");
//psi.UseShellExecute = true;
//Process pros = new Process();
//pros.StartInfo = psi;
//pros.Start();
#endregion
//通过一个进程打开指定的文件
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\Administrator\Desktop\1.txt");
psi.UseShellExecute = true;
Process pros = new Process();
pros.StartInfo = psi;//StartInfo需要一个ProcessStartInfo的对象
pros.Start();
}
}
}
二、线程(Thread)
1、前台线程和后台线程
- **前台线程:**只有所有的前台线程都关闭才能完成程序关闭
- **后台线程:**只要所有的前台线程结束,后台线程自动结束
2、多线程
-
为什么要用多线程?
1、单线程会带来"假死"现象;
2、让计算机"同时"做多件事件,节约时间;
3、多线程可以让程序"同时"处理多个事情;
4、后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况 -
.NET如何实现多线程(线程同步)
1、编写产生线程所要执行的方法;
2、引用System.Threading命名空间
3、实例化Thread类,并传入一个指向线程所要运行方法的委托。(这个时候线程已经产生,但是还没有运行)
4、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定 -
在.Net下,不允许跨线程的访问
-
当线程被终止(Abort)后,就无法在重新启动(Start)了
-
线程在未执行完时被关闭,可能会导致系统的资源无法被释放并抛出异常,此时可判断新进程是否为null,如果不是,可手动用Abort将线程终止。
-
线程中如何访问其他控件?
C#在线程中禁止访问别的控件,但是,可以在程序被加载时取消系统的跨线程检查;
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
- 线程中如何访问带参数的方法?
1、如果线程执行的方法需要参数,那么要求这个参数必须时object类型;
2、参数在Start中放入。
3、Thread类的一些重要成员
- Start() 启动线程:告诉CPU该线程可以被执行,具体什么时候执行,由CPU决定
- Abort() 终止线程:直至完成之后不能再Start();
- Thread.Sleep():静态方法,可以使当前线程停止一段时间运行;
- Name:线程名
- Thread.CurrentThread:获得当前的线程引用
三、Socket网络编程
- 人通过【电话】可以通信
程序通过【Socket】来通信
套接字就是程序间的电话机 - 人和人直接打电话 ~~~~ 电话 ~~~~ 规定好的语言(如普通话)
电脑和电脑进行联系 ~~~~ Socket ~~~~ 协议(如HTTP、TCP、UDP)
1、Socket相关概念
-
socket:作为进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)
理解:假设客户端想要和服务器的某个应用程序进行联系,就需要知道服务器的IP地址,但服务器中的IP地址都一样,想要与具体的应用程序通信,此时就需要端口号。 -
端口:在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应用程序);
----例如:http使用80端口、ftp使用21端口、smtp使用25端口(我们一般使用50000以后的端口) -
Socket具有两种类型:
1、流式Socket(STREAM):
----是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但效率低;
2、数据报式Socket(DATAGRAM):
----式一种无连接的Socket,对应于无连接的UDP服务应用,不安全(对视,顺序混乱,在连接端要分析重排及要求重发),但效率高 -
注意:
1、一个Socket一次智能连接一台主机
2、Socket关闭后无法再次使用
3、每个Socket对象只能一台远程主机连接,如果你想连接到多台远程主机,你必须创建多个Socket对象 -
更贴切的理解,请点击我的另外一篇文章.
2、Socket一般应用模式
也可用下面这个更直观的理解
- 服务端的Socket(至少需要两个)
1、一个负责接收客户端连接请求(但不负责与客户端通信)
2、每成功接收到一个客户端的连接,便在服务端产生一个对应的负责通信的Socket
----在接收到客户端连接时创建
----为每个连接层高的哭护短请求在服务端都创建一个对应的Socket(负责和客户端通信) - 客户端的Socket
1、必须指定要连接的服务器地址和端口
2、通过创建一个Socket对象来初始化一个到服务器端的TCP连接
3、Socket通信基本流程图
四、案例
1、摇奖机
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 摇奖机
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool b =