C#多线程 Thread 异步委托

多线程是计算机同时执行多个任务,大大提高效率,尤其对于一些方法需要同时执行的情况

Thread

命名空间System.Threading

Thread创建线程

ThreadStart 可有可无

static void Main(string[] args)
{
    ThreadStart start = new ThreadStart(ChildTread);// ThreadStart对方法进行创建线程
    Thread thread = new Thread(start);//Thread 对线程进行操作
    thread.Start();//开始线程


    Console.WriteLine("Main结束");
}

private static void ChildTread()
{
    Console.WriteLine("ChildThread结束");
}

线程也可以使用lambda表达式

Thread thread = new Thread(()=>Console.WriteLine(""));
        static void Main(string[] args)
        {
            var thread = new Thread(() => { Thread.Sleep(100); Console.WriteLine("1234"); }) { IsBackground=false};
            thread.Start();
            Console.WriteLine("Main结束");
        }

Sleep(),Abort()

Thread类提供了其他方法Sleep(),Abort()

Thread.Sleep(i);//对当前的线程暂停i毫秒,i为整型
Thread thread = new Thread(start);//Thread 对线程进行操作
thread.Abort();//销毁线程

下面是其中一个测试,及其结果

static void Main(string[] args)
{

    ThreadStart start = new ThreadStart(ChildTread);// ThreadStart对方法进行创建线程
    Thread thread = new Thread(start);//Thread 对线程进行操作
    thread.Abort();
    try
    {
        thread.Start();//在销毁线程后进行开始
    }
    catch (Exception e)
    {
        Console.Write(e);//抛出异常结果
    }
    Console.WriteLine("Main结束");
}

private static void ChildTread()
{
    Console.WriteLine("ChildThread结束");
}

System.Threading.ThreadStartException: 线程未能启动。 ---> System.Threading.ThreadAbortException: 正在中止线程。
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)
   在 System.Threading.Thread.Start(StackCrawlMark& stackMark)
   在 System.Threading.Thread.Start()
   在 _2_多线程.Program.Main(String[] args) 位置 E:\C#数据结构\1\2_多线程\Program.cs:行号 20Main结束
请按任意键继续. . .

异步委托

这是一个委托

delegate void dele();
public static void Test()
{
    Console.WriteLine("Start!");
    Thread.Sleep(100);
    Console.WriteLine("Continue!");
    Thread.Sleep(100);
    Console.WriteLine("END!");
}

static void Main(string[] args)
{
    dele dele = Test;
    dele();
    Console.WriteLine("Main END");
}

由委托开启线程

delegate void dele();
public static void Test()
{
    Console.WriteLine("Start!");
    Thread.Sleep(100);
    Console.WriteLine("Continue!");
    Thread.Sleep(100);
    Console.WriteLine("END!");
}

static void Main(string[] args)
{
    dele dele = Test;
    dele.BeginInvoke(null, null);//开启一个线程,dele();
    Console.WriteLine("Main END");
}

但是可以看到委托的方法未执行完,但当主函数结束,程序便结束了

若将其用thread类实现,可以很明显看到,主线程和子线程都执行完了,他们是同步调用的

public static void Test()
{
    Console.WriteLine("Start!");
    Thread.Sleep(100);
    Console.WriteLine("Continue!");
    Thread.Sleep(100);
    Console.WriteLine("END!");
}

static void Main(string[] args)
{
    Thread thread = new Thread(Test);//建立操作线程的方法
    thread.Start();
    Console.WriteLine("Main END");
}

thread和异步委托相当于前台线程和后台线程;

前台线程在main函数执行完成后依然会继续执行,程序不会结束;

后台线程在main函数执行完后会全部关闭

不过后台线程一般是在建立线程后面加上{ IsBackground=true},当为true时便是后台线程

public static void Test()
{
    Console.WriteLine("Start!");
    Thread.Sleep(100);
    Console.WriteLine("Continue!");
    Thread.Sleep(100);
    Console.WriteLine("END!");
}

static void Main(string[] args)
{
    Thread thread = new Thread(Test) { IsBackground = true };//后台委托
    thread.Start();
    Console.WriteLine("Main END");
}

执行结果:可以看到与异步委托执行结果相同

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,可以使用多线程来实现异步加载。一种常见的方法是使用Thread类创建子线程,并在子线程中执行需要异步加载的任务。可以通过ThreadStart委托将要执行的方法与新线程对象关联起来。例如,在FrmQC111_Load方法中,可以创建一个新的线程load,并将loadpage方法与该线程关联起来。loadpage方法中使用Action委托与具体的方法Bindt进行绑定,并使用BeginInvoke方法进行异步调用。Bindt方法用于实现加载控件数据源的操作。[1] 另一种常见的方法是使用Task类来执行异步任务。在.NET 4.0及以上版本中,可以使用Task类来实现异步操作。Task类提供了一种更方便的方式来执行异步任务,并且可以提高程序的运行效率。在.NET 5.0中,还引入了async/await关键字,使得异步编程更加方便。[2] 下面是两种方法的示例代码: 使用Thread类: ```csharp private void FrmQC111_Load(object sender, EventArgs e) { Thread load = new Thread(new ThreadStart(loadpage)); load.Start(); } private void loadpage() { // 执行异步加载的操作 Bindt(); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 使用Task类: ```csharp private async void FrmQC111_Load(object sender, EventArgs e) { await Task.Run(() => Bindt()); } private void Bindt() { // 实现具体的加载操作 // ... } ``` 以上是两种常见的在C#中实现多线程异步加载的方法。具体选择哪种方法取决于你的需求和编程习惯。[3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值