优秀的编程知识分享平台

网站首页 > 技术文章 正文

180.C# 线程的基本操作(c#线程编程)

nanyue 2024-10-25 13:19:45 技术文章 2 ℃

摘要


线程的生命周期包括:创建线程 、挂起线程、线程等待、终止线程

正文


因为我们是用Winform做线程实例,所以需要跨线程UI操作的一些技术。

一个例子,点击开始,会在文本框中每10毫秒输出一个点。

创建线程

通过new 一个Thread对象并指定线程执行函数创建线程。调用Start方法开启线程

private void btnStart_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(ShowDot);
    thread.Start();
}

void ShowDot()
{
    for (int i = 0; i < 100; i++)
    {
        this.Invoke((() =>
        {
            txtValue.Text += ".";
        }));
        System.Threading.Thread.Sleep(10);
    }
}

通过在线程函数中调用Thread.Sleep()暂停当前线程,使线程进入休眠状态。此时线程会占用尽可能少的CPU时间。

线程等待

假设有线程t,在主程序中调用了t.Join()方法,该方法允许我们等待直到线程t完成。当线程t完成 时,主程序会继续运行。借助该技术可以实现在两个线程间同步执行步骤。第一个线程会等待另一个线程完成后再继续执行。第一个线程等待时是处于阻塞状态(正如暂停线程中调用 Thread.Sleep方法一样)

private void btnStart_Click(object sender, EventArgs e)
{

    Thread thread = new Thread(ShowDot);
    thread.Start();
    thread.Join();
    Thread thread1 = new Thread(ShowDot1);
    thread1.Start();
}

void ShowDot()
{
    for (int i = 0; i < 100; i++)
    {
        this.BeginInvoke((() =>
        {
            txtValue.Text += ".";
        }));
        System.Threading.Thread.Sleep(10);
    }

}
void ShowDot1()
{
    for (int i = 0; i < 100; i++)
    {
        this.BeginInvoke((() =>
        {
            txtValue1.Text += ".";
        }));
        System.Threading.Thread.Sleep(10);
    }
}

终止线程

private void btnStart_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(ShowDot);
    thread.Start();
    // SpinWait 不仅仅只是空循环。谨慎实现后,它可以提供适用于一般情况的正确旋转行为,
    // 并且本身能够在旋转时间够长(大致是内核转换所需的时间长度)时自行启动上下文切换。
    //有点像Sleep
    SpinWait.SpinUntil(() => false, 100);
    thread.Interrupt();
}

void ShowDot()
{
    for (int i = 0; i < 100; i++)
    {
        this.BeginInvoke((() =>
        {
            txtValue.Text += ".";
        }));
        System.Threading.Thread.Sleep(10);
    }

}

thread.Abort(); 这个在.Net中不支持了,只在.Net Framework中支持。

Tags:

最近发表
标签列表