>  기사  >  백엔드 개발  >  C# 5.0 함수 Async의 자세한 그래픽 코드 설명 한눈에 보기

C# 5.0 함수 Async의 자세한 그래픽 코드 설명 한눈에 보기

黄舟
黄舟원래의
2017-03-03 13:30:231336검색

마이크로소프트가 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 등의 키워드를 추가하세요.

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

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

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

공부에 관심이 있다면 Run8742468051c85b06f0a0af9e3e506b5c이 실제로 호출하는 과제를 살펴보세요. .Factory.StartNew8742468051c85b06f0a0af9e3e506b5c, 이 Start48c15ee73f6e332a8a171e10c6563c6c는 먼저 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을 사용하면 설계 중에도 컴파일러가 자동으로 Task8742468051c85b06f0a0af9e3e506b5c 유형을 으로 변환합니다. ㄷ형.

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

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으로 문의하세요.