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.NET中,HiddenField隱藏控制元件的用法
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控制元件庫,WebForms,ASP.NET MVC,Core,JavaScript)!
還記得 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