C# 多线程 BeginInvoke EndInvoke

委托开启线程

1、调用

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine("开始执行");
    Action<string> action = this.Print;
    // 开启多线程
    action.BeginInvoke("hello", null, null);
    Console.WriteLine("结束执行");
}

public void Print(string name) {
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine($"{i}+{name}");
        Thread.Sleep(1000);
    }
}

2、线程结束后,进行后续操作

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine("开始执行");
    Action<string> action = this.Print;

    // callback 方法, ar是boject类型,用来传值
    AsyncCallback callback = (ar) => {
        Console.WriteLine($"object类型的值:{ar.AsyncState}");
        Console.WriteLine("执行完线程后调用callback方法");
    };
    action.BeginInvoke("hello", callback, "你好");
    
    Console.WriteLine("结束执行");
}


public void Print(string name) {
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine($"{i}+{name}");
        Thread.Sleep(1000);
    }
}

3、查看线程是否完成(轮询)

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine("开始执行");
    Action<string> action = this.Print;
    IAsyncResult asyncResult = action.BeginInvoke("hello", null, null);

    while (!asyncResult.IsCompleted) {
        // 等待2秒进行一次操作
        Console.WriteLine("线程没有结束");
        Thread.Sleep(1000 * 2);
    }

    Console.WriteLine("线程执行结束后的操作");

    Console.WriteLine("结束执行");
}


public void Print(string name) {
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine($"{i}+{name}");
        Thread.Sleep(1000);
    }
}

4、阻塞一定时间或线程结束后,进行后续操作

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine("开始执行");
    Action<string> action = this.Print;
    IAsyncResult asyncResult = action.BeginInvoke("hello", null, null);
    // 阻塞2秒后,执行下面的操作,线程依然在执行
    // WaitOne()没有值,等待线程执行结束后,再进行操作
    asyncResult.AsyncWaitHandle.WaitOne(2*1000);    

    Console.WriteLine("线程执行2秒后的操作");

    Console.WriteLine("结束执行");
}


public void Print(string name) {
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine($"{i}+{name}");
        Thread.Sleep(1000);
    }
}

5、EndInvoke,等待线程执行继续,进行后面的操作

private void btnInvoke_Click(object sender, EventArgs e)
{
    Console.WriteLine("开始执行");
    Action<string> action = this.Print;
    IAsyncResult asyncResult = action.BeginInvoke("hello", null, null);
    // 直到线程执行结束,进行下面的操作
    action.EndInvoke(asyncResult);
    Console.WriteLine("线程执行结束后的操作操作");
    Console.WriteLine("结束执行");
}


public void Print(string name) {
    for (int i = 0; i < 20; i++)
    {
        Console.WriteLine($"{i}+{name}");
        Thread.Sleep(1000);
    }
}

 

posted @ 2025-06-28 17:07  市丸银  阅读(56)  评论(0)    收藏  举报