1. 程式人生 > >ASP.NET 委託,非同步呼叫例子

ASP.NET 委託,非同步呼叫例子

 簡要介紹:
1.定義非同步執行需要呼叫的方法
2.定義具有與非同步執行方法相同簽名的委託(Delegate);
3.呼叫 BeginInvoke 和 EndInvoke 方法。
   3.1. BeginInvoke 方法用於啟動非同步呼叫。它與需要非同步執行的方法具有相同的引數,
       只不過還有兩個額外的引數。BeginInvoke 立即返回,不等待非同步呼叫完成。
       BeginInvoke 返回 IasyncResult,可用於監視呼叫進度。
   3.2. EndInvoke 方法用於檢索非同步呼叫結果。呼叫 BeginInvoke 後可隨時呼叫 EndInvoke 方法;
       如果非同步呼叫未完成,EndInvoke 將一直阻塞到非同步呼叫完成。
       EndInvoke 的引數包括需要非同步執行的方法的 out 和 ref 引數以及由 BeginInvoke 返回的 IAsyncResult。
   3.3.呼叫了 BeginInvoke 後,可以:
      * 進行某些操作,然後呼叫 EndInvoke 一直阻塞到呼叫完成。
      * 使用 IAsyncResult.AsyncWaitHandle 獲取 WaitHandle,使用它的 WaitOne 方法將執行一直阻塞到發出 WaitHandle 訊號,然後呼叫 EndInvoke。
      * 輪詢由 BeginInvoke 返回的 IAsyncResult,確定非同步呼叫何時完成,然後呼叫 EndInvoke。
      * 將用於回撥方法的委託傳遞給 BeginInvoke。該方法在非同步呼叫完成後在 ThreadPool 執行緒上執行,它可以呼叫 EndInvoke。  


//具體程式碼如下:

using System;
using System.Threading;

//The example of using delegate
namespace DelegateCallAsynchronousMethods
{

    class AsyncFileDelegate
   {
       /*
        *這是需要非同步執行的方法,COPY一個檔案
        */

        public void CopyFile(String fileName, out bool result)
        {
            Console.WriteLine("Move file "+fileName+"...");
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(200);
                Console.WriteLine("Move file is running..." + i);
            }
            Console.WriteLine("Move file finished");
            result = true;
        }
       
       /*
        *定義COPY檔案的委託,將來CopyFile方法就委託給它去非同步執行
        */

        public delegate void CopyFileDelegate(String fileName, out bool result);//Declare copy file delegate

        static void Main()
       {
            bool result;
            AsyncFileDelegate aa = new AsyncFileDelegate();
            // 開始委託方法,以後都由copyFile這個變數來做事
            CopyFileDelegate copyFile = new CopyFileDelegate(aa.CopyFile);

            Console.WriteLine("[Main] Invoking the asynchronous "+" Copy file method");
            //委託呼叫非同步方法去執行

            IAsyncResult iAR = copyFile.BeginInvoke("songlin.txt", out result, null, null);

            // 主方法不用等待COPY FILE方法,繼續自己的事情
            Console.WriteLine("[Main] Doing other work");
            for (int i = 0; i < 10; i++)
           {
                Thread.Sleep(200);
                Console.WriteLine("[Main]MainMethod is running..."+i);
            }
           
           
            Console.WriteLine(" [Main] Waiting for file transformation to finish");
            /* 主方法自己的事情做完,開始檢查COPYFILE有沒有完成。
             * 使用它的 WaitOne 方法將執行一直等到發出 WaitHandle 訊號,然後呼叫 EndInvoke。
             * 注意:非同步呼叫完成時會發出 WaitHandle 訊號,可以通過WaitOne 來等待它*/

            iAR.AsyncWaitHandle.WaitOne();

            Console.WriteLine("[Main] Copy file finished, cleaning up");
            /* EndInvoke 方法用於檢索非同步呼叫結果。呼叫 BeginInvoke 後可隨時呼叫 EndInvoke 方法;
             * 如果非同步呼叫未完成,EndInvoke 將一直阻塞到非同步呼叫完成。
             */

            copyFile.EndInvoke(out result, iAR);

            Console.WriteLine("[Main] The result is {0}", result);
            Console.ReadLine();
        }
    };

}


下面是輸出結果,可以看出copyfile方法和主方法是非同步執行的。
----------------------------------------------------------------------------------------------
[Main] Invoking the asynchronous Copy file method
[Main] Doing other work
Move file songlin.txt...
[Main]MainMethod is running...0
Move file is running...0
[Main]MainMethod is running...1
Move file is running...1
[Main]MainMethod is running...2
Move file is running...2
[Main]MainMethod is running...3
Move file is running...3
[Main]MainMethod is running...4
Move file is running...4
[Main]MainMethod is running...5
Move file is running...5
[Main]MainMethod is running...6
Move file is running...6
[Main]MainMethod is running...7
Move file is running...7
[Main]MainMethod is running...8
Move file is running...8
[Main]MainMethod is running...9
[Main] Waiting for file transformation to finish
Move file is running...9
Move file finished
[Main] Copy file finished, cleaning up
[Main] The result is True

以下是程式碼例子,模擬了檔案拷貝。每個檔案的拷貝方法都是在非同步方式下執行,同時主方法依然執行。

在主方法的最後會等待直到所有的非同步方法執行完成。

namespace WindowsApplication2

{

public class AsyncFileCopy

{

//Declare copy file delegate, will use this to invoke real copy file method

publicdelegate string CopyFileDelegate(int fileSize);

//The real file copy method, we simulate file copy with thread sleep

public String CopyFile(int fileSize)

{

switch (fileSize)

{

case 1:

Console.WriteLine("File 1 copy start...");

Thread.Sleep(1000);

Console.WriteLine("File 1 copy finished");

return "One";

case 2:

Console.WriteLine("File 2 copy Start...");

Thread.Sleep(2000);

Console.WriteLine("File 2 copy Finished");

return "Two";

case 3:

Console.WriteLine("File 3 copyStart...");

Thread.Sleep(3000);

Console.WriteLine("File 3 copy Finished");

return "Three";

default:

return "default";

}

}

public void ExecuteCopy()

{

List<WaitHandle> list = new List<WaitHandle>();

Console.WriteLine("Main method Start");

//Init coyp file delegate

CopyFileDelegate dlg = new CopyFileDelegate(CopyFile);

//Assume we have 4 different size files.

//Section below will let each file be copied in Async model

for (int i = 0; i < 4; i++)

{

//Let copy file executed in Async model, main thread continue

IAsyncResult ar = dlg.BeginInvoke(i, null, null);

list.Add(ar.AsyncWaitHandle);

Console.WriteLine("Main method still working" + i);

Thread.Sleep(10);//simulate main method cost some time

}

//Ensure all Async method finished before return from main method

System.Threading.WaitHandle.WaitAll(list.ToArray());

Console.WriteLine("Main method finished");

}

public static void <?XML:NAMESPACE PREFIX = ST1 />Main(string[] args)

{

AsyncFileCopy test = new AsyncFileCopy();

test.ExecuteCopy();

}

}

}

相關推薦

ASP.NET 委託非同步呼叫例子

 簡要介紹:1.定義非同步執行需要呼叫的方法2.定義具有與非同步執行方法相同簽名的委託(Delegate);3.呼叫 BeginInvoke 和 EndInvoke 方法。   3.1. BeginInvoke 方法用於啟動非同步呼叫。它與需要非同步執行的方法具有相同的引數,

一碼阻塞萬碼等待:ASP.NET Core 同步方法呼叫非同步方法“死鎖”的真相

在我們 2015 年開始的從 .NET Framework 向 .NET Core 遷移的工程中,遇到的最大的坑就是標題中所說的——同步方法中呼叫非同步方法發生”死鎖”。雖然在 .NET Framework 時代就知道不能在同步方法中呼叫非同步方法,但我們卻明知路有坑,偏向此路行。不是我們自討苦吃,而是被迫無

ASP.NET 創建WebService——簡單例子

本地 解析 com 調用 net XML ges png hone Web service是一個基於可編程的web的應用程序,用於開發分布式的互操作的應用程序,也是一種web服務 WebService的特性有以下幾點: 1.使用XML(標準通用標記語言)來作為數據交互的

ASP.NET Core2通過反射批量註入程序集

interface ont list() where each blog set pes pty public void ConfigureServices(IServiceCollection services) { string s

MVC引用asp.net報表(測試小例子

lse lsp publickey bag override request RR bre rda 1 public class Default1Controller : Controller 2 { 3 // 4 //

asp.net<%#%>,<%=%>和<%%>分別是什麽意思有什麽區別 --轉

bind ase bbbb pwd write ava int pla public 在asp.net中經常出現包含這種形式<%%>的html代碼,總的來說包含下面這樣幾種格式: 一. <%%> 這種格式實際上就是和asp的用法一樣的,只是asp中

spring boot整合swagger自定義註解攔截器xss過濾非同步呼叫定時任務案例

本文介紹spring boot整合swagger,自定義註解,攔截器,xss過濾,非同步呼叫,定時任務案例 整合swagger--對於做前後端分離的專案,後端只需要提供介面訪問,swagger提供了介面呼叫測試和各種註釋的視覺化web介面。配置swagger的掃描包路徑,api資訊等,見配置類Swagger

asp.net mvc 使用Ajax呼叫Action 返回資料【轉】

    使用asp.net mvc 呼叫Action方法很簡單。 一、無引數方法。 1、首先,引入jquery-1.5.1.min.js 指令碼,根據版本不同大家自行選擇。 <script src="@Url.Content("~/

SimplCommerce(asp.net core)把MSSql換成MySQL

SimplCommerce,一個不錯的商城原始碼,拿來玩一玩,使用mysql 開始之前先核對一下版本把,我是2018.10.20號下載的版本,一直在研究hyper-h這個虛擬機器 .net sdk 2.1.304,我現在在github上已經要2.1.402了,我電腦是

開始使用ASP.NET Identity初級篇

在之前的文章中,我為大家介紹了OWIN和Katana,有了對它們的基本瞭解後,才能更好的去學習ASP.NET Identity,因為它已經對OWIN 有了良好的整合。在這篇文章中,我主要關注ASP.NET Identity的建立和使用,包括基礎類的搭建和使用者管理功能的實現—

ASP.NET MVC擴充套件非同步Action功能(下)

執行Action方法 對於執行同步Action的SyncMvcHandler,其實現十分簡單而直接:public class SyncMvcHandler : IHttpHandler, IRequiresSessionState { public SyncMvcHandler(

ASP.NET MVC擴充套件非同步Action功能(上)

非同步請求處理是ASP.NET 2.0中引入的高階特性,它依託IO Complete Port,對於提高IO密集型應用程式的吞吐量非常重要(詳見原理描述和效能測試)。但是目前ASP.NET MVC框架缺少非同步Action功能,這也就是老趙經常掛在嘴邊的那個“目前ASP.NET MVC所缺少的非常重要的功能

憑弔一下ASP.NET 5然後跨平臺越跨越開心

ASP.NET 5 is dead ASP.NET 5在今年早些時候被宣判死刑了。但是這並不影響我們之前在ASP.NET 5乃至ASP.NET MVC平臺上的經驗累積——沒錯,微軟改名部門又立功了!他們覺得ASP.NET 5會讓人覺得是4.6的升級版,所以改名成了ASP.NET Core 1.0...順帶把.

ASP.NET探針網站被莫名的掛馬

tz.aspx <%@ Page Language="C#" ContentType="text/html" responseEncoding="gb2312" SmartNavigation="True" aspcompat="true" %> <ht

關於Asp.net超時延長讀取sql server資料庫的超時時間!(已解決)

超時時間已到。在操作完成之前超時時間已過或伺服器未響應。 (.Net SqlClient Data Provider) 當讀取超過30秒後,就有這個提示,不知為什麼? -------------------------------------------------------------------- \\

ASP.NETHiddenField隱藏控制元件的用法

HiddenField控制元件就是隱藏輸入框的伺服器控制元件,他能讓你儲存那些不必顯示在頁面上的且對安全性需求不高的資料。也許這個時候應該有這麼一個疑問,為什麼有了ViewState、Session和Cookie等狀態儲存機制,還需要用起HiddenField呢? 增

重新註冊IIS中的ASP.NET版本解決IIS中ASP.NET版本無法切換等問題

-i         - 安裝 ASP.NET 的此版本,並更新 IIS 元資料庫根處的               指令碼對映和根以下的所有               指令碼對映。現有的低版本指令碼對映               升級到此版本。 -ir        - 安裝 ASP.NET 的此版本,

ASP.NET MVC 隨想錄——開始使用ASP.NET Identity初級篇

在之前的文章中,我為大家介紹了OWIN和Katana,有了對它們的基本瞭解後,才能更好的去學習ASP.NET Identity,因為它已經對OWIN 有了良好的整合。 在這篇文章中,我主要關注ASP.NET Identity的建立和使用,包括基礎類的搭建和使用者管理功能的實現—— 在後續文章中,我將

FineUIPro/Mvc/Core/JS v4.2.0 釋出了(老牌ASP.NET控制元件庫WebFormsASP.NET MVCCoreJavaScript)!

還記得 10 年前那個稍微青澀的 ExtAspNet 嗎,如今她已脫胎換骨,變成了如下 4 款產品: FineUIPro:基於jQuery的經典款ASP.NET WebForms控制元件,之前的FineUI(開源版)可以直接升級到此版本。 FineUIMvc:支援ASP.NET MVC5。 Fine

asp.net,和分別是什麼意思有什麼區別

在asp.net中經常出現包含這種形式<%%>的html程式碼,總的來說包含下面這樣幾種格式: 一. <%%> 這種格式實際上就是和asp的用法一樣的,只是asp中裡面是vbscript或者javascript程式碼,而在asp.net中是.net