线程学习

时间:2011-01-05 07:18:04

标签: c# .net multithreading concurrency

只是试图在那里ping一些经验丰富的线程专家...试图在没有很多实际代码问题的情况下学习更多关于线程的知识,这将有助于我更多地练习它。

我已经有了一些资源,但可能还有一些我不知道的优点:

  1. C# 2008 and 2005 Threaded Programming: Beginner's Guide (Book)(这是我考虑开始先看的那个)
  2. CLR via C# (Dev-Pro)(我也有这本书,Jeffery也有一些线程化的东西)
  3. Threading in C# - eBook
  4. Concurrent Programming on Windows
  5. .NET Multi-threading Book from 2003 (Book)(不确定这些东西是否过时......)
  6. 所以:

    1)正在寻找其他人(视频,书籍等)以及您对上述资源的看法(您会推荐某些更好或者过时/不好吗?)。

    2)此外,由于这是一个广泛且高度复杂的话题......作为一个完整的外国人,我正试图缩小某种理智的研究列表。线程是深入的,因此我只想介绍它们可能触及的基础知识或最可能的区域(锁定,线程安全等)。作为专家,我不需要进行这次采访......只是表明我对何时使用它,常见场景以及我可以向他们解释的几个例子并不完全无能为力。

    3)任何有线程经验的人都会给我一些好的资源,或者给我一些你认为我最应该注意的好的学习技巧或领域?

    4)显然,随着.NET 4.0的出现彻底改变了一些事情,但我主要关注的是.NET 3.5。我需要先了解THREADING的基本知识......概念,需要注意的事项,锁定,线程安全的单例(我知道John Skeet关于Singletons的页面等)。

    5)另一件可以帮助我的事情是真实世界的例子和使用线程的理由。 IIS端,OOP端,服务器场等都有。我想知道一些在真实应用中使用线程或常见场景的真实例子,你真正需要开始使用线程。

    我不需要每个人都回答我在这里的所有5个方面......即使是上述1-5中的一个建议也会非常感激。

    ...谢谢

    更新/免责声明(在收到一些关于我的假设后)

    不,我不会去那里声称我知道线程或者是它的专家,但是我是一个初学者,并且在过去的工作中只做了几件事并且还在学习。但我确实想说明为什么我在这里发布整个帖子的背景,这样你就可以帮助我在更短的时间内更好地磨练...过滤掉可能更好的路径,这样我就不会浪费我的时间既可以用于面试,也可以用于我未来的学习。

2 个答案:

答案 0 :(得分:2)

线程似乎很容易学习。你只需使用new Thread(ThreadFunc).Start(),瞧,你正在使用线程。这有多难,对吧?

线程问题不是你会直接注意到的东西,而是在你最不期望的时候偷偷摸摸的东西。当有一些负载并偶尔关闭系统时,它们通常会进入生产系统。

过了一段时间,您会发现在修改共享数据之前需要进行同步。当你开始这样做时,你会看到一个大的性能降低。

线程很容易上手,但需要数年才能掌握。保护共享数据是一门艺术,需要经过深思熟虑才能正确完成。我已经编写了多年的多线程服务器,包括带有IO完成端口的C ++和最近的C#。我仍然犯错,可能会在我的服务器上产生意想不到的结果。

至于你需要学习的主题:

  1. 使用Thread类查看一些示例。
  2. lock关键字。
  3. 异步编程(这很容易做错,只需查看所有关于它的SO问题)。 .Net使用BeginXXXX / EndXXXX进行异步编程。
  4. 除锁之外的其他锁定技术,例如SemaphoreReaderWriterLock
  5. Interlocked类。
  6. 我通常将这种模式用于Thread函数:

    public class Example
    {
        ManualResetEvent _myEvent = new ManualResetEvent(false);
        Thread _myThread;
        bool _isRunning = true;
    
        public Example()
        {
            _myThread = new Thread(WorkerFunc);
            _myThread.Start();
        }
    
    
        public void WorkerFunc()
        {
            while (_isRunning)
            { 
                try
                {
                    _myEvent.Wait(Timeout.Infinite);
                    _myEvent.Reset();
                    ActualFunc();
                }
                catch (ThreadAbortException) { return; }
                catch (Exception err)
                {
                     _logger.Error("Thread func failed, lucky we caught it so the server don't die..", err);
                }
            }
        }
    
        public void Stop()
        {
           _isRunning = false;
           _myEvent.Set();
           _myThread.Join();
        }
    
        public void DoWork()
        {
            //add some work to the thread job queue or something
            _myEvent.Set();
        }
    
        private void ActualFunc()
        {
             //actual thread work is done here
             // in a seperate method to keep everything clean.
        }
    }
    

    在答案中写到这里,不要保证它会100%有效:)

答案 1 :(得分:1)

对线程http://www.albahari.com/threading/的精彩介绍 虽然在.NET 4.0中引入了新的线程模式和技术,甚至在C# 5.0预览中,但对于潜入主题来说,这将是一个很好的介绍。

您还应该阅读有关线程池的信息。