마이크로소프트가 Async CTP를 출시한 지 한 달이 지났는데 모두가 화제를 모으고 있는 Async입니다. Async에 이미 익숙하신 분들은 건너뛰시기 바랍니다... 저 같은 경우에는 비동기 프로그래밍에 대해 조금밖에 모르시겠지만, 이전 내용은 비동기 프로그래밍이 더 까다롭습니다. 그렇다면 차세대 C#이 우리에게 가져올 것이 무엇인지 살펴보겠습니다. (비동기 CTP는 VB도 지원합니다.)
이 글의 예시는 Async CTP SP1 Refresh를 기준으로 작성되었습니다. Async는 아직 CTP 단계이기 때문에 아직 많은 논의가 진행 중이니 까지 기다려주시면 될 것 같습니다. C# 5.0 출시 시 세부 사항이 변경됩니다. 그러나 일반적인 아이디어와 개념은 크게 바뀌어서는 안 됩니다.
본점으로 이동:
먼저 Async 기능을 사용해 보세요. Visual Studio 2010 SP1 및 Microsoft 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 로그인 후 복사
|
然后,添加一个按钮的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的字样;第二行调用算法获得结果;第三行把结果输出。看似挺不算的。运行一下,就会发现有两个问题:
这个算法需要四五秒钟左右的实现时间,并且在这几秒钟的时间里,界面是锁死的,也就是说应用程序就像死了一样,它不接受任何用户操作。(也许我的电脑比较差,呵呵,所以,如果你没有遇到这种情况,请加大输入参数的值,让它算一会儿。)
我们没有看到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 애플리케이션 세트에 나타날 것으로 믿습니다.
두 번째: DoSomething을 Task로 캡슐화합니다.
셋째: async, await 등의 키워드를 추가하세요.
코드를 자세히 살펴보겠습니다.
먼저 비동기적으로 실행될 코드의 반환 값을 작업
그런 다음 Run
공부에 관심이 있다면 Run
첫 번째 줄은 Label; 두 번째 줄은 결과를 얻기 위해 알고리즘을 호출합니다. <--이 줄에 복사됨/이전 기사에서 붙여넣음:-)
헤헤 자세히 살펴보고Sync와 Async 코드:
비동기 | |
비공개 무효 btnSync_Click(개체 발신자, EventArgs e) |
비공개 비동기 무효 btnAsync_Click(객체 발신자, EventArgs e) |
먼저 메서드 이름에 async를 추가하여 이것이 비동기 호출을 사용하는 메서드임을 선언합니다.
그런 다음 await 키워드를 반환하기 전에 함수 호출(DoSomethingAsync)을 추가합니다. x가 어떤 유형인지 추측해 볼까요? 정답은 긴형 입니다. await을 사용하면 설계 중에도 컴파일러가 자동으로 Task
기능이 우리에게 가져다 주는 것은 무엇일까요? 비동기 프로그래밍의 능력인가? 콜백을 사용하여 비동기 작업을 수행할 수도 있으며 IAsyncCallback 인터페이스는 .NET 1.1에 있어야 합니다. 에서 구현되었습니다. 멀티 스레드 네임스페이스도 오랫동안 존재했습니다. Task는 C# 4.0... 제 생각에는
Async
가 프로그래머들에게 로직 중심의 코드를 제공하는 것 같아요. 다중 구현 스레드 프로그래밍. 최종 비교를 통해 Async의 코드는 Sync의 코드와 거의 동일하며, 프로그램은 no 콜백, 동기화 등의 문제를 고려하십시오. 이는 C#이 무엇을 더 열심히 설명하는지에 대한 방향과 일치합니다. 어떻게 하느냐보다는 끝났다. 마지막으로 애플리케이션 다운로드 및 소스 코드와 실행 인터페이스 스크린샷을 첨부합니다... (알겠습니다. 저는 아티스트가 아닙니다. 양해해 주시기 바랍니다. 나:-)
)
소스 코드를 다운로드하려면 클릭
비동기
보기 실행 프롬프트로 이동:
실행 결과 표시:
위 내용은 C# 5.0 함수의 Async에 대한 자세한 그래픽 코드 설명을 한눈에 볼 수 있습니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(m.sbmmt.com)를 참고하세요!