C#編程任務: 把工做交給別人並等待其執行完成

生活中有這樣的場景: 多線程

我有一件事情須要別人幫忙去辦, 可是別人也很忙呀, 因此我只能把任務記載他的任務清單上, 等他一個個掃下來掃到個人而且完成以後再來告訴我.函數

這實際上是一個多線程的問題. 我是線程A, 他是線程B, 這裏我是生產者, 他是消費者. 而我在等待他完成我提交的任務以前並不能作什麼事情, 也就是說我, 線程A, 得阻塞等待B執行完個人任務並來通知我. spa

貌似實現起來挺簡單, 一個死循環加一個bool就能夠了. 在任務Obj中加bool isCompleted=false; 當線程B執行完成以後設置成true. 而我就while(!isCompleted);死等就能夠了. 嗯, 這裏的死等可能會讓單核CPU100%那麼while(!isCompleted){Thread.Sleep(1);}這樣就完美了.線程

確實不錯, 可是能不能優雅一點? code

好比使用Monitor. 我翻了一下msdn...沒什麼想說的了, 這個sample寫的跟直接叫你去使用lock關鍵字同樣.blog

對於大多數狀況下的線程資源加鎖, 其實使用關鍵字lock真的能夠了. 可是在這個狀況下, 須要用到另外兩個函數:資源

Monitor.Wait()和Monitor.Pulse()get

代碼以下:it

        static void MonitorSample()
        {
            var obj = new object();
            Monitor.Enter(obj);
            Console.WriteLine(DateTime.Now);
            Thread t = new Thread(() => {
                Thread.Sleep(2000);
                Monitor.Enter(obj);
                Thread.Sleep(2000);
                Monitor.Pulse(obj);
                Thread.Sleep(2000);
                Monitor.Exit(obj);
            });
            t.Start();
            Monitor.Wait(obj);

            Console.WriteLine(DateTime.Now);
            Console.WriteLine("over");
            Console.ReadKey();
        }

跑一遍再看看函數說明就清楚了. class

注意實際使用中最好加上try{}finally{Monitor.Exit(xxx);}

相關文章
相關標籤/搜索