学习笔记——线程 Thread

Thread是.net1.0 1.1时出现的

主要了解线程等待、回调、前后台线程区别

1.实例

//定义:public delegate void ThreadStart();

ThreadStart threadStart = new ThreadStart(() =>

{

    Thread.Sleep(5000);

    this.DoSomethingLong("btnThreads_Click");

});

Thread thread = new Thread(threadStart);

//thread.IsBackground = true;//变成后台线程

thread.Start();//默认是前台线程,UI线程退出后,还会继续执行完;后台线程就直接退出了

 

 2.等待(如果线程执行完毕,dosomething())

 while (thread.ThreadState != System.Threading.ThreadState.Running)

 {

  dosomething()

 }

 

3.获取线程执行后的返回值

/// <summary>

/// 带返回值的

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="funcT"></param>

/// <returns></returns>

private Func<T> ThreadWithReturn<T>(Func<T> funcT)

{

    T t = default(T);

    ThreadStart startNew = new ThreadStart(

        () =>

        {

            t = funcT.Invoke();

        });

    Thread thread = new Thread(startNew);

    thread.Start();

 

    return new Func<T>(() =>

    {

        thread.Join();//线程执行完才返回t.(主线程会等待子线程完成)

        return t;

    });

}

调用方法获取返回值

Func<int> func = this.ThreadWithReturn(() =>//begininvoke

  {

      Thread.Sleep(2000);

      Console.WriteLine($"这里是ThreadStart {Thread.CurrentThread.ManagedThreadId.ToString("00")}");

      return 12345;

  });

Console.WriteLine("已经执行到这里了。。。");

int iResult = func.Invoke();//endinvoke

 

4.回调

/// <summary>

/// 基于Thread封装支持回调

/// BeginInvoke的回调

/// </summary>

/// <param name="threadStart"></param>

/// <param name="callback"></param>

private void ThreadWithCallback(ThreadStart threadStart, Action callback)

{

    ThreadStart startNew = new ThreadStart(

        () =>

        {

            threadStart();

            callback.Invoke();

        });

    Thread thread = new Thread(startNew);

    thread.Start();

}

//委托的异步调用 测试:ThreadWithCallback

this.ThreadWithCallback(() =>

{

    Thread.Sleep(2000);

    Console.WriteLine($"这里是ThreadStart {Thread.CurrentThread.ManagedThreadId.ToString("00")}");

}

, () =>

 {

     Thread.Sleep(2000);

     Console.WriteLine($"这里是callback {Thread.CurrentThread.ManagedThreadId.ToString("00")}");

 });

 

 参考资料:http://www.cnblogs.com/lvcy/archive/2012/06/16/2551539.html

posted @   鲁燕云端  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示