同事寫了這樣一段代碼:
FactoryStartNew類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SunCreate.Common.ComLib { /// <summary> /// 2018-12-19 (勿修改其中代碼) /// </summary> public class FactoryStartNew { private static log4net.ILog m_Log = log4net.LogManager.GetLogger(typeof(FactoryStartNew)); /// <summary> /// 通過執行緒運行函式 /// </summary> /// <typeparam name="TResult">回傳值型別</typeparam> /// <param name="action">運行函式</param> /// <returns>回傳值</returns> public static TResult StartNewThread<TResult>(Func<TResult> action) { try { TResult bRst; System.Threading.Tasks.Task<TResult> va = System.Threading.Tasks.Task.Factory.StartNew<TResult>(() => { return action(); }) .ContinueWith<TResult>(o => { return o.Result; }); bRst = va.Result; return bRst; } catch (System.Exception ex) { m_Log.Error(ex); return default(TResult); } } } }View Code
在WCF服務中使用:
public IList<VIPF_VIDEO_DEVICE> GetAllDevice() { if (HI.Get<ISecurityImp>().CheckTicket()) { return FactoryStartNew.StartNewThread<IList<VIPF_VIDEO_DEVICE>>(() => { return HI.Get<IBaseDataImp>().GetAllDevice(); }); } return new List<VIPF_VIDEO_DEVICE>(); }View Code
我認為這個代碼是錯誤的:當StartNewThread這個方法執行一個耗時的操作時,在執行操作的時間內,子執行緒在執行耗時操作,呼叫執行緒即父執行緒在阻塞(因為這句代碼:bRst = va.Result;),這樣在執行操作這段時間內,長時間占用了兩個執行緒,多占用了一個執行緒,而且這個方法被寫成了同步方法,而不是一個異步方法,WCF服務端所有方法都用StartNewThread方法包裝一下,會導致多使用一倍的執行緒來處理同樣多的請求,
跟同事說過多次,但同事至今認為他的方法沒有問題他對Task的理解沒有錯,所以我打算把這個隨筆發到博客園,看看評論中能否有簡捷清晰的描述,讓同事明白這個問題,或者,我的理解是錯的,
我比較執著,雖然能夠容忍專案中有不好的代碼,但是無法容忍如此重要的代碼存在錯誤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/196864.html
標籤:.NET技术
上一篇:紙殼CMS分布式部署集群解決方案
