찾다
백엔드 개발C#.Net 튜토리얼C# 5.0 함수 Async의 자세한 그래픽 코드 설명 한눈에 보기

마이크로소프트가 Async CTP를 출시한 지 한 달이 지났는데 모두가 화제를 모으고 있는 Async입니다. Async에 이미 익숙하신 분들은 건너뛰시기 바랍니다... 저 같은 경우에는 비동기 프로그래밍에 대해 조금밖에 모르시겠지만, 이전 내용은 비동기 프로그래밍이 더 까다롭습니다. 그렇다면 차세대 C#이 우리에게 가져올 것이 무엇인지 살펴보겠습니다. (비동기 CTPVB도 지원합니다.)


이 글의 예시는 Async CTP SP1 Refresh를 기준으로 작성되었습니다. Async는 아직 CTP 단계이기 때문에 아직 많은 논의가 진행 중이니 까지 기다려주시면 될 것 같습니다. C# 5.0 출시 시 세부 사항이 변경됩니다. 그러나 일반적인 아이디어와 개념은 크게 바뀌어서는 안 됩니다.

본점으로 이동:

먼저 Async 기능을 사용해 보세요. Visual Studio 2010 SP1Microsoft Visual Studio Async CTP(SP1 Refresh)를 설치해야 합니다.

먼저 간단한 작업을 설정해 보겠습니다. 콜백을 사용하여 비동기 프로그래밍을 개선하고 비동기프로그래밍 방법을 분석하고, Async정확히 무엇이고 우리에게 무엇을 가져다 주는지 살펴보겠습니다.

작업:

버튼을 클릭하면 Windows Form 애플리케이션을 만듭니다. 먼저 한 줄의 단어를 표시합니다. 예를 들어 상태를 나타내는 무언가 계산을 시작한 다음 1에서 int.Max/2까지 계산합니다. 결과를 ​​누적하여 표시합니다.

동기화를 수행합니다.

먼저 기본 알고리즘을 구현하는 함수를 작성합니다.

  #region
 Do things

                     
public
 
long
 DoSomething(
int
 n)

                     {

                         
long
 result = 1;

                         
for
 (
int
 i = 1; i <= n; i++)

                         {

                             result += i;

                         }

                         
return
 result;

                     }
        #endregion

 
private
 
void
 btnSync_Click(
object
 sender, 
EventArgs
 e)

                     {

                         lblResult.Text = 
"Start to do something . . ."
;

                         
long
 value = DoSomething(
int
.MaxValue / 2);

                         lblResult.Text = value.ToString();

                     }


然后,添加一个按钮的Click事件处理程序:

 
private
 
void
 btnSync_Click(
object
 sender, 
EventArgs
 e)

                     {

                         lblResult.Text = 
"Start to do something . . ."
;

                         
long
 value = DoSomething(
int
.MaxValue / 2);

                         lblResult.Text = value.ToString();

                     }


代码第一行改写Label的字样;第二行调用算法获得结果;第三行把结果输出。看似挺不算的。运行一下,就会发现有两个问题:

  1. 这个算法需要四五秒钟左右的实现时间,并且在这几秒钟的时间里,界面是锁死的,也就是说应用程序就像死了一样,它不接受任何用户操作。(也许我的电脑比较差,呵呵,所以,如果你没有遇到这种情况,请加大输入参数的值,让它算一会儿。)

  1. 我们没有看到Start to do something这一行字。

 

OK,出现这个现象也是可以理解的,因为我们把大量的运算添加到了UI线程里面了。所以,解决方法就是把它放到外面。我试了一下不用Async,实现的代码如下:

private
 
void
 btnCallback_Click(
object
 sender, 
EventArgs
 e)

                     {

                         lblResult.Text = 
"Start to do something . . ."
;

                         Func<
int
, 
long
> callBackDelegate = 
this
.DoSomething;
            callBackDelegate.BeginInvoke(

                             
int
.MaxValue / 2,

                             
new
 AsyncCallback(

                             a =>

                             {

                                 lblResult.Invoke(
new
 MethodInvoker(() =>

                                     {

                                         lblResult.Text = callBackDelegate.EndInvoke(a).ToString();

                                     }));

                             }),

                             
null
);

                     }


如果你觉得这段代码比较晕,那就跳过这一节吧。可能我代码写得不好,大家将就看我简单解释一下,我首先给DoSomething写了一个代理,然后,调用了代理的BeginInvoke方法,把算法放到了其它的Thread中去调用了。这个代理执行完了以后,因为它不会直接返回一个long型的值,而是会去执行一个AsyncCallBack,所以,就在这个Callback里,去调用这个代理的EndInvoke()

 

好吧,且不论代码质量,这个就是有Async之前的一种实现异步的方法。

从这个代码里,我们完全看不到原来代码的影子,我也没有办法像解释同步代码一样解释:第一、第二、第三……有了Async之后呢?呵呵,代码说明一切:

public
 
Task
<
long
> DoSomethingAsync(
int
 n)

                     {

                        
return
 
TaskEx
.Run<
long
>(() => DoSomething(n));

                     }
 
        
private
 
async
 
void
 btnAsync_Click(
object
 sender, 
EventArgs
 e)

                     {

                         lblResult.Text = 
"Start do something..."
;

                         
var
 x = 
await
 DoSomethingAsync(
int
.MaxValue / 2);

                         lblResult.Text = x.ToString();

                     }


세 가지:

첫 번째: 파일 참조 추가: AsyncCtpLibrary.dll. Async가 정식 출시된 후에는 .NET 애플리케이션 세트에 나타날 것으로 믿습니다.

두 번째: DoSomethingTask로 캡슐화합니다.

셋째: async, await 등의 키워드를 추가하세요.

코드를 자세히 살펴보겠습니다.

먼저 비동기적으로 실행될 코드의 반환 값을 작업. 이 반환 값에는 실제로 세 가지 옵션이 있습니다: void, TaskTask 자세한 사용법은 C#4.0MSDN에서 Task를 확인하세요. 수업.

그런 다음 Run에서 TaskEx 메서드를 호출하여 통과시켰습니다. 이는 long 값을 반환하는 메서드입니다. 이것이 우리 작업의 알고리즘입니다.

공부에 관심이 있다면 Run이 실제로 호출하는 과제를 살펴보세요. .Factory.StartNew, 이 Start는 먼저 Task를 빌드합니다. 그런 다음 Start 메서드가 호출됩니다...

알고리즘을 작업에 봉인하고 완료하세요.

코드의 두 번째 부분이 설명하기 더 쉽습니다.

첫 번째 줄은 Label; 두 번째 줄은 결과를 얻기 위해 알고리즘을 호출합니다. 이 줄에 복사됨/이전 기사에서 붙여넣음:-)

헤헤 자세히 살펴보고

SyncAsync 코드:

동기화

비동기

        비공개 무효 btnSync_Click(개체 발신자, EventArgs e)
                    {
                        lblResult.Text = 
"뭔가를 시작하세요 . . .";
                        
long value = DoSomething(int.MaxValue / 2);
                        lblResult.Text = value.ToString();
                    }

        비공개 비동기 무효 btnAsync_Click(객체 발신자, EventArgs e)
                    {
                        lblResult.Text = 
"뭔가 시작하세요...";
                        
var x = 대기 DoSomethingAsync(int.MaxValue / 2);
                        lblResult.Text = x.ToString();
                    }

먼저 메서드 이름에 async를 추가하여 이것이 비동기 호출을 사용하는 메서드임을 선언합니다.

그런 다음 await 키워드를 반환하기 전에 함수 호출(DoSomethingAsync)을 추가합니다. x가 어떤 유형인지 추측해 볼까요? 정답은 형 입니다. await을 사용하면 설계 중에도 컴파일러가 자동으로 Task 유형을 으로 변환합니다. ㄷ형.

코드는 여기서 끝나는데, 새로운

Async

기능이 우리에게 가져다 주는 것은 무엇일까요? 비동기 프로그래밍의 능력인가? 콜백을 사용하여 비동기 작업을 수행할 수도 있으며 IAsyncCallback 인터페이스는 .NET 1.1에 있어야 합니다. 에서 구현되었습니다. 멀티 스레드 네임스페이스도 오랫동안 존재했습니다. TaskC# 4.0... 제 생각에는

Async

가 프로그래머들에게 로직 중심의 코드를 제공하는 것 같아요. 다중 구현 스레드 프로그래밍. 최종 비교를 통해 Async의 코드는 Sync의 코드와 거의 동일하며, 프로그램은 no 콜백, 동기화 등의 문제를 고려하십시오. 이는 C#이 무엇을 더 열심히 설명하는지에 대한 방향과 일치합니다. 어떻게 하느냐보다는 끝났다. 마지막으로 애플리케이션 다운로드 및 소스 코드와 실행 인터페이스 스크린샷을 첨부합니다... (알겠습니다. 저는 아티스트가 아닙니다. 양해해 주시기 바랍니다. 나:-)

)

소스 코드를 다운로드하려면 클릭

비동기

보기 실행 프롬프트로 이동:

실행 결과 표시:


최신 및 가장 공식적인 Async 정보는 여기에 있습니다: ^v^

http://msdn.microsoft.com/Async

위 내용은 C# 5.0 함수의 Async에 대한 자세한 그래픽 코드 설명을 한눈에 볼 수 있습니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
C# 및 .NET 런타임 : 함께 작동하는 방법C# 및 .NET 런타임 : 함께 작동하는 방법Apr 19, 2025 am 12:04 AM

C# 및 .NET 런타임은 개발자가 효율적이고 강력하며 크로스 플랫폼 개발 기능을 강화하기 위해 긴밀히 협력합니다. 1) C#은 .NET 프레임 워크와 완벽하게 통합하도록 설계된 유형 안전 및 객체 지향 프로그래밍 언어입니다. 2) .NET 런타임은 C# 코드 실행을 관리하고, 쓰레기 수집, 유형 안전 및 기타 서비스를 제공하며, 효율적이고 크로스 플랫폼 운영을 보장합니다.

C# .NET 개발 : 시작에 대한 초보자 안내서C# .NET 개발 : 시작에 대한 초보자 안내서Apr 18, 2025 am 12:17 AM

C# .NET 개발을 시작하려면 다음과 같은 것이 필요합니다. 1. C#의 기본 지식과 .NET 프레임 워크의 핵심 개념을 이해하십시오. 2. 변수, 데이터 유형, 제어 구조, 기능 및 클래스의 기본 개념을 마스터하십시오. 3. LINQ 및 비동기 프로그래밍과 같은 C#의 고급 기능을 배우십시오. 4. 일반적인 오류에 대한 디버깅 기술 및 성능 최적화 방법에 익숙해 지십시오. 이러한 단계를 통해 C#.NET의 세계를 점차적으로 침투하고 효율적인 응용 프로그램을 작성할 수 있습니다.

C# 및 .NET : 둘 사이의 관계 이해C# 및 .NET : 둘 사이의 관계 이해Apr 17, 2025 am 12:07 AM

C#과 .NET의 관계는 분리 할 수 ​​없지만 같은 것은 아닙니다. C#은 프로그래밍 언어이며 .NET은 개발 플랫폼입니다. C#은 코드를 작성하고 .NET의 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행되는 데 사용됩니다.

C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오.C# .NET의 지속적인 관련성 : 현재 사용법을 살펴보십시오.Apr 16, 2025 am 12:07 AM

C#.NET은 여러 응용 프로그램 개발을 지원하는 강력한 도구 및 라이브러리를 제공하기 때문에 여전히 중요합니다. 1) C#은 .NET 프레임 워크를 결합하여 개발 효율적이고 편리하게 만듭니다. 2) C#의 타입 안전 및 쓰레기 수집 메커니즘은 장점을 향상시킵니다. 3) .NET은 크로스 플랫폼 실행 환경과 풍부한 API를 제공하여 개발 유연성을 향상시킵니다.

웹에서 데스크톱으로 : C# .NET의 다양성웹에서 데스크톱으로 : C# .NET의 다양성Apr 15, 2025 am 12:07 AM

C#.NETISVERSATILEFORBOTHWEBBANDDESKTOPDEVENTROMMENT.1) FORWEB, useASP.NETFORRICHINTERFACES.3) FORDESKTOP.3) USEXAMARINFORCROSS-PLATFORMDEEVENTRIMMENT, LINABILEDEV, MACODEDEV, and MACODEDOWS, 및 MACODEDOWS.

C# .net 및 미래 : 신기술에 적응C# .net 및 미래 : 신기술에 적응Apr 14, 2025 am 12:06 AM

C# 및 .NET는 지속적인 업데이트 및 최적화를 통해 신흥 기술의 요구에 적응합니다. 1) C# 9.0 및 .NET5는 레코드 유형 및 성능 최적화를 소개합니다. 2) .NETCORE는 클라우드 네이티브 및 컨테이너화 된 지원을 향상시킵니다. 3) ASP.NETCORE는 최신 웹 기술과 통합됩니다. 4) ML.NET는 기계 학습 및 인공 지능을 지원합니다. 5) 비동기 프로그래밍 및 모범 사례는 성능을 향상시킵니다.

c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다c# .net이 당신에게 적합합니까? 적용 가능성을 평가합니다Apr 13, 2025 am 12:03 AM

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

.NET 내의 C# 코드 : 프로그래밍 프로세스 탐색.NET 내의 C# 코드 : 프로그래밍 프로세스 탐색Apr 12, 2025 am 12:02 AM

.NET에서 C#의 프로그래밍 프로세스에는 다음 단계가 포함됩니다. 1) C# 코드 작성, 2) 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행됩니다. .NET에서 C#의 장점은 현대적인 구문, 강력한 유형 시스템 및 .NET 프레임 워크와의 긴밀한 통합으로 데스크탑 응용 프로그램에서 웹 서비스에 이르기까지 다양한 개발 시나리오에 적합합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경