C#WinForm开发笔记——进程类

本文是关于C# WinForm应用程序的开发笔记,重点介绍了进程(Process)的概念,线程(Thread)的使用,包括前台线程、后台线程、多线程的实现,以及Socket网络编程的基础知识,如Socket相关概念、应用模式和通信流程。文中还提供了线程访问控件的注意事项和Socket通信案例,包括服务器端和客户端的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程(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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪 ~smart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值