. NET 의 비동기 프로 그래 밍 - EAP / APM 사용 방법 및 사례 소개

7216 단어
. NET 4.5 부터 지원 하 는 세 가지 비동기 프로 그래 밍 모드:
• 이벤트 기반 비동기 프로 그래 밍 디자인 모드 (EAP, Event - based Asynchronous Pattern)
• 비동기 프로 그래 밍 모델 (APM, 비동기 프로 그래 밍 모델)
• 작업 기반 프로 그래 밍 모델 (TAP, Task - based Asynchronous Pattern)
작업 기반 비동기 모드 (TAP) 는 System. Threading. Tasks 네 임 스페이스 를 기반 으로 하 는 Task 와 Task 로 임의의 비동기 작업 을 표시 합 니 다.TAP 는 새로 개 발 된 비동기 설계 모델 로 나중에 논의 하 자.
먼저 기 존의 두 가지 모델 을 정리 해 보 자. EAP, APM.
다음 과 같은 몇 가지 측면 에서 볼 때 이 두 가지 비동기 프로 그래 밍 방식 의 공통점 과 차이 점 은 다음 과 같다.
• 이름, 매개 변수, 반환 값
• 전형 적 인 응용
• 포획 이상
상태
• 작업 취소
진도 보고
EAP
이름, 파라미터, 반환 값
EAP 의 프로 그래 밍 모드 의 코드 이름 은 다음 과 같은 특징 이 있 습 니 다.
• '방법 이름' Async '라 는 방법 이 하나 이상 있 을 것 입 니 다.이 방법 들 은 동기 화 버 전의 미 러 를 만 들 수 있 습 니 다. 이 동기 화 버 전 들 은 현재 스 레 드 에서 같은 동작 을 수행 합 니 다.
• 이 종 류 는 '방법 이름' Complete '사건 이 있 을 수 있 으 며, 비동기 적 인 방법 을 감청 한 결과 가 있 을 수 있 습 니 다.
• 진행 중인 비동기 작업 을 취소 하 는 데 사용 되 는 '[방법 이름] AsyncCancel' (또는 CancelAsync) 방법 이 있 을 수 있 습 니 다.
매개 변수 와 반환 값 은 모두 특별한 규정 이 없 으 며, 업무 수요 에 따라 결정 된다.
전형 적 인 응용
Url 을 요청 하 는 것 을 예 로 들 면
 
  
public class EAP_Typical
{
public static void AsyncRun()
{
Utility.Log("AsyncRun:start");
//
string url = http://sports.163.com/nba/;
using (WebClient webClient = new WebClient())
{
//
webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(new Uri(url));
Utility.Log("AsyncRun:download_start");
}
}
static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string log = "AsyncRun:download_completed";
//
log += "|result_size=" + Utility.GetStrLen(e.Result);
Utility.Log(log);
}
}

포획 이상
이상 정 보 는 보통 Complete 의 이벤트 매개 변수 에서 전 달 됩 니 다.위의 예 에 이 어 되 돌아 오 는 이상 한 정 보 를 얻 으 려 면 DownloadString Comleted 방법 을 바 꿔 야 합 니 다.
 
  
static void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string log = "AsyncRun:download_completed";
if (e.Error != null) // ,
{
// ,
log += "|error=" + e.Error.Message;
}
else
{
// ,
log += "|result_size=" + Utility.GetStrLen(e.Result);
}
Utility.Log(log);
}

상태.
EAP 자체 가 상 태 를 유지 하지 않 았 습 니 다. 필요 하 다 면 서로 다른 시간 을 설정 하여 서로 다른 상태 변화 에 응답 해 야 합 니 다.
방금 DownloadString Async 를 가정 하면 상태 값 을 몇 개 더 늘 려 야 합 니 다. 여러 개의 이 벤트 를 추가 하 는 것 을 고려 할 수 있 습 니 다.
... 와 같다
이벤트 DownloadStringStarted (응답 다운로드 시작)
이벤트 DownloadStringPending (다운로드 차단 에 응답)
이벤트 DownloadStringCancel (다운로드 취소 응답 시)
잠깐 만.
작업 취소
이름 규범 에 따라 '[방법 이름] AsyncCancel' (또는 CancelAsync) 방법 이 있 으 면 취소 작업 을 지원 합 니 다.
취 소 된 상태 캡 처 는 방금 Url 출력 html 를 다운로드 한 것 을 예 로 들 면 DownloadStringComplete 에서 취소 여 부 를 가 져 오 는 상태 입 니 다.DownloadStringCompletedEventArgs. Cancelled
사용자 가 CancelAsync 를 실행 한 후 DownloadStringComplete EventArgs. Error 에서 해당 하 는 이상 을 가 져 옵 니 다. 이 때 DownloadStringComplete EventArgs. Result 를 다시 가 져 오지 마 십시오.
진도 보고
EAP 는 진도 보고 서 를 지원 하 겠 다 는 딱딱 한 규정 은 없 지만 자 연 스 럽 게 시간 을 통 해 진도 변화 에 응 할 수 있다.
현재 예 를 들 어 웹 클 라 이언 트 는 DownloadProgressChanged 가 진행 변 화 를 하 는 응답 이 벤트 를 제공 합 니 다.
APM
이름, 파라미터, 반환 값
APM 프로 그래 밍 모드 의 코드 이름 은 다음 과 같은 특징 이 있 습 니 다.
• IAsyncResult 디자인 모드 를 사용 하 는 비동기 작업 은 [Begin 작업 이름] 과 [End 작업 이름] 이라는 두 가지 방법 으로 이 루어 집 니 다. 이 두 가지 방법 은 각각 비동기 작업 이름 을 시작 하고 끝 냅 니 다.예 를 들 어 FileStream 류 는 BeginRead 와 EndRead 방법 을 제공 하여 파일 에서 바이트 를 비동기 로 읽 습 니 다.이 두 가지 방법 은 Read 방법의 비동기 버 전 을 실현 했다.
• [Begin 작업 이름] 을 호출 한 후에 프로그램 은 호출 스 레 드 에서 명령 을 계속 실행 할 수 있 고 다른 스 레 드 에서 비동기 작업 을 수행 할 수 있 습 니 다.[Begin 작업 이름] 을 호출 할 때마다 프로그램 은 [End 작업 이름] 을 호출 하여 작업 결 과 를 가 져 와 야 합 니 다.
전형 적 인 응용
Url 을 요청 하 는 것 을 예 로 들 면
 
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace AsyncTest1.APM
{
public class APMTestRun1
{
public static void AsyncRun()
{
Utility.Log("APMAsyncRun:start");
//
string url = "http://sports.163.com/nba/";
HttpWebRequest webRequest = HttpWebRequest.Create(url) as HttpWebRequest;
webRequest.BeginGetResponse(Callback, webRequest);
Utility.Log("AsyncRun:download_start");
}
private static void Callback(IAsyncResult ar)
{
var source = ar.AsyncState as HttpWebRequest;
var response = source.EndGetResponse(ar);
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content));
}
}
}
}
}

의뢰 한 비동기 호출 도 APM 모드 를 사용 합 니 다. 이 방식 의 강력 한 점 은 모든 방법 으로 비동기 호출 을 프로 그래 밍 할 수 있 습 니 다.
 
  
///
///
///

private static void CaluateManyNumber() {
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("loop==>"+i.ToString());
}
}
///
/// ,
///

public static void AsyncDelegate() {
//
Action action = CaluateManyNumber;
action.BeginInvoke(DelegateCallback, null);
Console.WriteLine("action begin");
}
///
///
///

///
private static void DelegateCallback(IAsyncResult ar) {
AsyncResult asyncResult = ar as AsyncResult;
var delegateSource = asyncResult.AsyncDelegate as Action;
delegateSource.EndInvoke(ar);
Console.WriteLine("action end");
}

포획 이상
이상 정 보 는 [End 작업 이름] 에서 가 져 옵 니 다.
 
  
private static void Callback(IAsyncResult ar)
{
var source = ar.AsyncState as HttpWebRequest;
WebResponse response = null;
try
{
response = source.EndGetResponse(ar);
}
catch (Exception ex) {
Utility.Log("error:" + ex.Message);
response = null;
}
if (response != null)
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Utility.Log("AsyncRun:result_size=" + Utility.GetStrLen(content));
}
}
}
}

상태 및 취소 작업, 진도 보고서
APM 모드 자 체 는 상태 다양화 와 작업 취소, 진도 보고 서 를 지원 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기