線上課程筆記—.NET基礎

来源:http://www.cnblogs.com/netxiaohui/archive/2016/10/16/5967594.html
-Advertisement-
Play Games

關於學習北京理工大學金旭亮老師線上課程的筆記。 介紹: 線上課程網址:http://mooc.study.163.com/university/BIT#/c 老師個人網站:http://jinxuliang.com/MainWebSite 10.10號開課的,主要有三個課程,其中我最想學習的就是老師... ...


關於學習北京理工大學金旭亮老師線上課程的筆記。

介紹

線上課程網址:http://mooc.study.163.com/university/BIT#/c

老師個人網站:http://jinxuliang.com/MainWebSite

10.10號開課的,主要有三個課程,其中我最想學習的就是老師最新的那個關於講解ASP.NET Core的課程。現在推出來一章,昨天我學習了,很是受益(雖然我環境還沒安裝好,電腦配置是個傷呀)。對於想瞭解Core相關技術的同學來說很有幫助。(最起碼有個參考的地方),其中後面還有關於依賴註入,IOC容器,AngularJS,DDD相關知識的講解(高大上的知識呀)。據說老師的這個網站就是通過ASP.NET Core技術來創建的。

dynamic類型

在之前的項目中就經常使用這個類型,但是對於這個知識點不是很清楚。今天算是重新學習了。

dynamic類型是動態類型,和我們常規的類型不一樣,它是可以改變變數的值的特殊類型。就好比下麵的代碼一樣。


//dynamic是一種動態類型,可以在編譯的時候直接改變變數中的值。而不是像常規的類型一樣。不可以進行值的改變。
              dynamic test = "test1";
            Console.WriteLine(test.GetType());
            test = 23;
            Console.WriteLine(test.GetType());            


輸出就是倆個不同的類型,在我們的ASP.NET MVC中的ViewBag就是使用的是dynamic類型;(想不到吧>)

下麵的例子是在此類型中添加委托方法。同樣可以將方法輸出。


            dynamic myBag = new ExpandoObject();
            myBag.intValue = 100;
            myBag.message = "hello";
            //聲明委托方法,str相當與方法的參數。{}中的值就是方法體;
            Action<string> act = (str) => { Console.WriteLine(str); };
            //將方法賦值給say方法;
            myBag.say = act;
            Console.WriteLine(myBag.intValue*10);
            Console.WriteLine(myBag.message);
            myBag.say(myBag.intValue.ToString()); //方法參數為string類型
             myBag.say(myBag.message);


開始聲明瞭ExpandoObject()對象;這個是在命名空間System.Dynamic中的,裡面就一個方法,意思是表示一個對象,該對象包含可在運行時動態添加和移除的成員(包括屬性和方法)方法是初始化不包含任何成員的新 ExpandoObject。

image

委托與Lambda表達式

我們先看一些常規的委托是如何實現的。

委托方法的使用:


      //1:聲明委托
       public delegate string SomeDelegateType(int value);    
      class MyClass
      {
          //2:定義委托方法
          public string process(int value)
         {
             return value.ToString();
         }
      }


          MyClass ob=new MyClass();
            //3:聲明委托變數,且為其賦值方法。
            SomeDelegateType del = ob.process;
            //4:調用委托,這個del其實就相當於process()方法一樣。
            Console.WriteLine(del(100));


改造後的Lambda表達式:


    //1:聲明委托
    public delegate string SomeDelegateType(int value);    
   SomeDelegateType del = (value) =>value.ToString();
   Console.WriteLine(del(100));


比較:

使用Lambda表達式可以不需要寫那麼多的代碼,委托的實際方法不需要定義。不需要實例化變數。其實要是使用自帶的委托類型還不需要定義委托;


            Func<int,string> del = (value) =>value.ToString();
            Console.WriteLine(del(100));


瞭解Lambda表達式:

image

image

任務並行庫(TPL:Task Parallel Library)

TPL是開發高性能.NET應用程式的利器,是.Net程式非同步編程的基石。學習它可以更好的學習async/await非同步編程模式;

  • 開發並行程式的關鍵在於找到一個合適的任務分解方案;
  • 並行總要付出一定的代價,比如線程同步,線程通信,同步緩衝數據等都是需要考慮的問題。
  • 需要仔細設計並行演算法,並且應該在多個軟硬體環境中測試。

.NET平臺中的並行計算組件

多線程和串列程式的比較

image

思考一下,為什麼會出現多線程編程,主要是合理的理由電腦CPU的資源,不讓其閑下來,在有限的時間內處理更多的事情,提高資源利用率。

   提升抽象層次是降低軟體開發難度,提高軟體開發效率的有效方法;

image


image 

Parallel開發並行計算程式

Paraller內置三種典型的代碼執行法式

  • Parallel.Invoke();並行執行方式;
  • Parallel.For();並行迴圈;
  • Parallel.ForEach();並行迭代;

這個Parallel是依賴於底層的Task類完成工作的。Task類的一個實例,代表一個可以被執行的工作任務,是“任務並行庫”中的和興類型;

基於TPL開發並行計算程式,幾乎所有的工作都圍繞著Task而展開

背景線程

  • 主線程結束之後背景線程才結束;
  • 非同步調用是由線程遲中的線程負責執行的;
  • await語句不會阻塞調用者線程;
  • 同一個方法中的代碼,以await為邊界,被劃分為兩塊(或者多塊,取決於await語句有多少個),然後,會由線程池中的某個線程來負責執行它們。
  • async/await 實際上是一種語法糖,它的功能完全可以由TPL實現,也可以直接使用線程實現,使用async/await的好處是可以寫出簡潔的代碼;

async/await適合的場景
  多線程的桌面應用程式;
  服務端的I/O密集操作;

並行計算任務的創建與啟動

1:可以直接通過new關鍵字創建一個Task對象,Task的構造函數接收一個Action類型的委托,用於封裝需要並行執行的功能代碼;

image[4]

任務對象創建完畢之後,調用它的Start()方法啟動,此任務將被追加到線程池的任務列表中調度執行。

     t.Start();

2:可以把Task對象的創建和運行結合在一起;

    Task t=Task.Factory.StartNew(
                  () =>{ 任務方法});

     Task s = Task.Run(()=>{});

返回一個”用於延遲”的任務

Task.Delay()方法返回一個Task對象,它主要用在有await/async的非同步方法中,其特點是不會阻塞調用者線程;實際開發中這樣使用這個

       await Task.Delay(5000);

demo

        private static void UseTask()
        {
            Console.WriteLine("使用Task.Delay()方法拖慢程式運行速度");
            //通過委托來實例化函數,來操作非同步;
            Task.Run(() =>
            {
                for (int i = 1; i <=10; i++)
                {
                    Console.WriteLine("{0}",i);
                    Task.Delay(500).Wait();                           //線程等待
                }
            }).Wait();      
        }

取回Task的運行結果

  • 使用傳統的多線程編程技術,利用線程同步對象取回結果;
  • 使用Task<T>.Result,以阻塞等待方式取回結果;
  • 使用Task.ContinueWith()方法,以回調方式取回結果;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在FFT處理線面呢,很多人就說要加窗,加窗的好處了就是防止能量泄露和高頻濾波啊,不過精度呢就會相應的降低。(聽說是這樣的。本人小白) 窗的種類也很多啦,然後聽說啥都不懂的就可以了選擇漢寧窗。。。 在MATLAB裡面呢直接調用hann(); 然後呢在stm32裡面呢就直接一個for。。。。。。感覺用了 ...
  • 感覺直接貼代碼會好點。。。。。。 有些註釋直接從Keil5裡面粘出來到這裡就不支持了。。。。。。。好尷尬。。。。下次碼代碼註釋還是全英算了、、、 哈哈。。有什麼問題可以一起來探討、、、不知道為啥分類不到嵌入式那裡只好點Linux那裡了。。 ...
  • ST公司為了方便客戶使用FFT,自己做了一個庫,不過這個庫是有限制的。點數必須是4的次方,分別是64、256和1024個點。速度完全滿足客戶的要求。 1、第一步必須添加使用FFT的庫文件到inc和src中。附上百度雲網盤鏈接(http://pan.baidu.com/s/1gfHkS0b) 2、導入 ...
  • 使用一個簡單的for迴圈和if判斷語句實現某個網段內所有ping所有客戶機的shell程式: 在這裡i是一個迴圈變數,一共迴圈254次,${i}相當於192.168.10.0這個網段中從1~254的主機號。 for迴圈開始然後進行if判斷: 判斷 ping 192.168.10.xxx這個網段中的所 ...
  • readonly 相當於C中的const,readonly將變數設為只讀模式,任何針對他們的賦值都是錯誤的 export 修改或列印環境變數,可以將變數放在環境里,放到環境里的變數可供所有的進程通過環境共用 unset 刪除變數 刪除變數var_name 刪除其他變數 刪除函數 shift 用來截去 ...
  • 一、簡單介紹 1、LinQ to Sql類(NET Language Integrated Query (LINQ) ) LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#中)。使用這些操作符可以編寫查詢語句。不過,這些查詢還可以基於很多類型的數 ...
  • 最近在做.net項目,因為本人以前做java較多,所以對.net不熟悉,在項目完成後部署到IIS伺服器上出現諸多問題,以上其中之一,若有時間,在更新其他問題的解決辦法! 異常詳細信息: System.Data.SqlClient.SqlException: 用戶 'NT AUTHORITY\IUSR ...
  • 摘要:在 "迷宮問題求解之“窮舉+回溯”(一)" 這篇文章中採用“窮舉+回溯”的思想,雖然能從迷宮的入口到出口找出一條簡單路徑,但是找出來的不是最優路徑。因此本文采用A 搜索演算法,求解迷宮問題的最優路徑。 1 A 搜索演算法簡介 A 搜索演算法是一種啟髮式搜索演算法。所謂啟髮式搜索演算法,就是在盲目搜索演算法 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...