In to the C# 2015. 1. 29. 13:16

C# 6.0 New Features

조만간 릴리즈될 C# 6.0 (현재 Preview 공개)의 new feature들을 보니, 그동안 불편했던 부분이 많이 개선이 되고 있음을 느낄 수 있었습니다.

 

재밌고 유용한 내용들을 모아보았습니다.

 

Static Using Syntax

기존에 using 지시자는 namespace에 사용할 수 있었습니다. 이제는 static 클래스에도 사용이 가능해졌습니다.

 

예를 들어 System 네임스페이스에 있는 static class Console에 using을 사용하면, 코드에서 Console.WriteLine() 대신 WriteLine()를 사용할 수 있습니다.

 

물론, 커스텀 클래스에도 적용이 가능합니다.

 

https://dotnetfiddle.net/tYMyBB

 

  

Auto Property Initializers

가장 마음에 드는 기능 중에 하나입니다. 기존에는 프로퍼티를 선언과 동시에 초기화할 수가 없어서, 생성자에서 초기화를 하였습니다.

 

하지만 이제는 생성과 동시에 초기화를 할 수가 있게 되었습니다.

 

https://dotnetfiddle.net/2hDVTJ

 

 

 

Dictionary Initailizers

Dictionary의 초기화 방법이 추가되었습니다. 기존 방식은 아래와 같은데, 초기 아이템이 많아질 수록, key 혹은 value가 클래스 타입일 수록 코드가 복잡했습니다.

 

새로 추가된 초기화 방법은 다음과 같은데, 가독성이 좀 더 나아진 느낌입니다.

 

https://dotnetfiddle.net/23VUxF

 

 

 

Null Condition Operator

null 체크 오퍼레이터가 추가되어 if (obj == null)과 같은 코드를 줄일 수가 있습니다.

 

 

 

Expression Bodied Functions and Properties

Expresson Bodied Functions과 Properties가 새로 추가되었습니다.

 

 

 

'In to the C#' 카테고리의 다른 글

[C#] REST API 만들기  (0) 2014.02.13
[C#] Task의 작업완료  (2) 2014.01.26
[C#] Action, Func 그리고 Task  (0) 2014.01.26
[C#] Attribute : 속성  (0) 2014.01.24
Lazy Initialization  (0) 2014.01.20
BDC 2014. 12. 18. 08:01

[BDC14] C++11 by swkwon

C++11


'BDC' 카테고리의 다른 글

[BDC14] 유니티3D Coroutine 활용 by twofree  (0) 2014.12.18
[BDC14] 내가요즘하는건 by DeathKnight  (0) 2014.12.18
BDC 2014. 12. 18. 07:55

[BDC14] 유니티3D Coroutine 활용 by twofree

Unity3D, coroutine.


'BDC' 카테고리의 다른 글

[BDC14] C++11 by swkwon  (0) 2014.12.18
[BDC14] 내가요즘하는건 by DeathKnight  (0) 2014.12.18
BDC 2014. 12. 18. 07:51

[BDC14] 내가요즘하는건 by DeathKnight

Node.js, Docker, Google Analytics.


'BDC' 카테고리의 다른 글

[BDC14] C++11 by swkwon  (0) 2014.12.18
[BDC14] 유니티3D Coroutine 활용 by twofree  (0) 2014.12.18
hello world 2014. 10. 31. 13:20

telegram-cli 이걸로 뭐하지?


Telegram(https://telegram.org이 국내에서 흥하게 되었는데, 이 텔레그램이 OPEN API 입니다.

telegram-cli 란 linux 용 프로그램입니다. 스크립트나 콘솔명령으로 메세지를 보낼 수 있습니다.

그럼 이걸로 뭘 하나 생각해 보니


1. 심심이 


2. 카톡 미연시


3. 서버 제어 : http://truefeel.tistory.com/224


4. 장애 알림

5. REST 를 이용한 MSG 발송 

등등.. 서버 프로그래머 입장에서 해보고 싶은게 많습니다.


서론은 여기까지.. 텔레그램을 깔아 봅시다.


Linux 에서 늘 하던데로 소스받고,  configure , make 하면 끝~

https://github.com/vysheng/tg 에 잘 설명 되있습니다.


OS 는 CentOS 에 설치 했습니다.


1. 소스받고 압축 풀고

 wget https://github.com/vysheng/tg/archive/master.zip -O tg-master.zip
 unzip tg-master.zip && cd tg-master

2. 빌드에 필요한 패키지 깔고

 sudo yum install lua-devel openssl-devel libconfig-devel readline-devel libevent-devel

3. 빌드하면 끝 !

 ./configure
 make

이건 CentOS 7 얘기... 현실은

event-old.h: In function 'event_new':
event-old.h:16: error: implicit declaration of function 'malloc'
event-old.h:16: error: incompatible implicit declaration of built-in function 'malloc'
event-old.h: In function 'evtimer_new':
event-old.h:24: error: incompatible implicit declaration of built-in function 'malloc'
event-old.h: In function 'event_free':
event-old.h:33: error: implicit declaration of function 'free'
event-old.h:33: error: incompatible implicit declaration of built-in function 'free'
tgl-timers.c: In function 'tgl_timer_free':
tgl-timers.c:59: error: implicit declaration of function 'event_get_callback_arg'
tgl-timers.c:59: error: initialization makes pointer from integer without a cast
make: *** [objs/tgl-timers.o] Error 1

난 CentOS6 이지...

이럴땐 !! 예전이었다면 아둥바둥 왜 안되는지 알아보고, 이것저것 고쳐보고...했겠지만 

이젠 Docker 를 사용합니다.


Docker - An open platform for distributed applications for developers and sysadmins. 

https://www.docker.com


설치와 사용법은 나중에 자세히 알아보고 docker 로 CentOS 7 환경을 올립니다. 

[root@localhost ~]# docker pull centos 

로 이미지 받아와서 들어가면 CentOS7 환경에서 작업할 수 있습니다.

[root@localhost ~]# docker run -i -t centos:centos7 /bin/bash
bash-4.2# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
위 예제로 들어가면 image 를 띄운거기 때문에 나오면 데이터가 다 없어집니다.
이미지와 컨테이너의 차이를 느껴보시고,
만약에 docker 안에서 port를 listen 할 일이 있다면 -p 옵션으로 포트도 포워딩 해줘야 합니다. -p 8080:8080 으로 

[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED ...

cd2b01f5645f centos:centos7 /bin/bash 2 minutes ago ... 9b05fb4f5b8f centos:centos6 /bin/bash 12 minutes ago ... 62368a818401 9b9939481a40 /bin/bash 16 hours ago ... e9d15253d9d7 cc7c33cb9d68 /bin/bash 16 hours ago ...

당황하지 않고 사용한 컨테이너 ID를 찾아서 commit 하면 image 로 생성되어 다음에 작업했던데 부터 사용할 수 있습니다. 자세한 사용법은 나중에?


centos7 환경에선 잘 됩니다.

ar: creating libs/libtgl.a a - ./objs/net.o a - ./objs/mtproto-common.o ....... a - ./objs/updates.o a - ./objs/tgl-timers.o a - ./objs/tools.o gcc ./objs/main.o ./objs/loop.o ./objs/interface.o ./objs/lua-tg.o .........

telegram-cli 를 실행해서 내 번호를 등록합니다. 나중엔 ID만으로도 가입된다고 하니 기다려 봅시다.
bash-4.2# bin/telegram-cli
change_user_group: can't find the user telegramd to switch to
Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
I: config dir=[//.telegram-cli]
Telephone number (with '+' sign): 
인증번호를 확인해서 넣어주면 사용이 가능합니다.

Telephone number (with '+' sign): +8210******** Code from sms (if you did not receive an SMS and want to be called, type "call"): 36692 >

어떻게 사용하는지 help 를 확인해 보면 주르륵~

help    Prints this help

contact_list    Prints contact list

stats   For debug purpose

history <peer> [limit] [offset] Prints messages with this peer (most recent message lower). Also marks messages as read

dialog_list     List of last conversations

send_photo <peer> <file>        Sends photo to peer

send_video <peer> <file>        Sends video to peer

send_audio <peer> <file>        Sends audio to peer

send_document <peer> <file>     Sends document to peer

send_text <peer> <file> Sends contents of text file as plain text message

chat_info <chat>        Prints info about chat (id, members, admin, etc.)

user_info <user>        Prints info about user (id, last online, phone)

fwd <peer> <msg-id>     Forwards message to peer. Forward to secret chats is forbidden

fwd <peer> <msg-id>     Forwards message media to peer. Forward to secret chats is forbidden. Result slightly differs from fwd

msg <peer> <text>       Sends text message to peer

....

우선 주소를 등록하고 보내 봅니다.

> add_contact +8210******** yongdae kwon

yongdae kwon

> msg yongdae_kwon hello

[02:14]  yongdae kwon <<< hello

잘 되네요 ( 주의 : firstname 과 lastname 사이에 '_' 를 넣으셔야 합니다. )

bash 에서 보내보겠습니다.
bash 에서 실행할때는 몇가지 옵션이 필요합니다. -k 로 인증키를 지정해주고 -W 옵션으로 지연처리?를 해주고..

bash-4.2# echo "msg yongdae_kwon hello" | bin/telegram-cli -k ./tg-server.pub -W

change_user_group: can't find the user telegramd to switch to

Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman

Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.

This is free software, and you are welcome to redistribute it

under certain conditions; type `show_license' for details.

I: config dir=[//.telegram-cli]

User Telegram updated photo

User SANGWOOK KWON updated photo

> msg yongdae_kwon hello

[03:22]  yongdae kwon <<< hello

> All done. Exit

잘 보내집니다.


node.js 의 express 와 연결해서 보내봅시다.

javascript 를 추가 하고

var exec = require('child_process').exec; app.get('/msg', function( req, res ) { var _cmd = 'msg ' + req.param('id',null) + ' ' + req.param('msg',null); console.log( _cmd ); exec( "echo '" + _cmd + "' | telegram-cli -k /home/tg-master/tg-server.pub -W " , 

function(err, stdout, stderr) { 

if(err) { 

console.log(err.message); 

} );

res.send('send msg');

});

웹에서 접근하면~

잘 보내지네요.


Lua Script 를 이용하면 ( 참고 : http://truefeel.tistory.com/224 )

function on_msg_receive (msg)

if ( msg.text == 'hello' ) then

send_msg(msg.from.print_name, "world", ok_cb, false)

return

end

end

function ok_cb(extra, success, result)

end

스크립트와 함께 돌리면

bash-4.2# bin/telegram-cli -s ../hello.lua
change_user_group: can't find the user telegramd to switch to
Telegram-cli version 1.1.0, Copyright (C) 2013-2014 Vitaly Valtman
Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show_license' for details.
I: config dir=[//.telegram-cli]
 *** lua: attempt to call a nil value
 *** lua: attempt to call a nil value
 *** lua: attempt to call a nil value
[03:30]  yongdae kwon ««« hello
 *** lua: attempt to call a nil value
[04:07]  yongdae kwon <<< world
hello 라고 새로온 메세지에 wold 라고 보냅니다.
잘되네요...

쉘스크립트에 포함에서 사용해서 모니터링으로 사용해도 좋고,
돈을내고 문자서비스를 이용하는 대신 텔레그램을 사용하는 것도 나쁘진 않을것 같습니다.

하지만 내 전화번호로 인증해야하니 회사에서 사용하기는 그렇고, 나중에 ID 인증이 된다면 그때 다시 생각해 보는걸로...


db/Oracle 2014. 7. 17. 13:53

[TIP] 오라클 패스워드 대소문자 구분 해제

오라클은 패스워드에 대소문자를 구분하지 않도록 설정할 수 있는 파라메터가 있습니다.


c:\ > set ORACLE_SID=TEST_DB    // DB 별로 설정해야 합니다.

c:\ > sqlplus '/as sysdba'


설정 :

SQL> alter system set sec_case_sensitive_logon = FALSE;


확인 :

SQL> show parameter sec_case_sensitive_logon;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon             boolean     TRUE


테스트 :

SQL > conn TEST/TEST;

SQL > conn test/test;







'db > Oracle' 카테고리의 다른 글

[ERROR] ORA-06552, ORA-06553  (0) 2014.06.27
db/Oracle 2014. 6. 27. 12:38

[ERROR] ORA-06552, ORA-06553

원인 : DB 생성할때 언어설정을 잘못해서 NLS_LANGUAGE 값을 따로 업데이트 했더니 꼬여서 발생하는 문제


상황 : PL/SQL Developer 에서는 별 문제 없었는데, 백업 문제로 DBMS_METADATA.GET_DDL 함수에서 에러가 발생


ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-553: 알 수 없는 문자 집합 이름입니다


확인 :



을 실행하면 아래와 같이 VARCHAR2 의 CHARACTER_SET 이 중복으로 나오면 꼬인거라고 생각하면 됩니다.


CHARACTERSET                            TYPES_USED_IN
-----------------------------------------------------

US7ASCII                                VARCHAR2

AL16UTF16                              VARCHAR2


해결 : sqlplus "/as sysdba" 로 접속

1. sql> shoutdown immediate; -- 데이터베이스 종료

2. sql> startup mount; -- 데이터 베이스 인스턴스 시작

3. sql> alter system enable restricted session; -- 제한된 세션 사용

4. sql> alter system set job_queue_processes=0; -- JOB을 생성할수 있는 프로세스 숫자 제한

5. sql> alter system set aq_tm_processes=0; -- 정확히 뭐하는건지 모름 

6. sql> alter database open;

7. sql> col value new_value charset 

8. sql> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';    -- 캐릭터셋 을 변수에 저장

9. sql> col value new_value ncharset

10. sql> select value from nls_database_parameters where parameter='NLS_NCHAR_CHARACTERSET'; -- 네셔널 캐릭터셋 도 저장

11. sql> alter database character set internal_use &charset; -- 캐릭터셋 적용

12. sql> alter database national character set interanl_use &ncharset -- 네셔널 캐릭터셋 적용

13. sql> shoutdown immediate; -- 데이터베이스 종료

14. sql> startup; -- 데이터베이스 시작

'db > Oracle' 카테고리의 다른 글

[TIP] 오라클 패스워드 대소문자 구분 해제  (0) 2014.07.17
In to the C# 2014. 2. 13. 00:48

[C#] REST API 만들기

참고 : http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api


갑자기 REST 를 게임서버에서 하시는 분은 없겠죠... 

이미 여러곳에서 쓰는걸로 알고 있고, 특히 EVE 온라인에서는 외부에 API 를 공개해 유저들이 다양한 정보를 활용, 앱 같은걸 만들 수 있게 사용하고 있습니다.
( eve online. CREST document : https://wiki.eveonline.com/en/wiki/CREST_Documentation )


REST 는 여러 분야에서 사용하고 있으니 Pass...


저는 이걸 어따 쓸려고 하면.. 서버 패치, 실행, 관리 등에 사용할려고 작업중입니다. 

각 Agent 의 프로토콜을 REST로 해놓으면 가져다 붙이 좋을꺼라는 생각에..


REST를 구현 하기 위해 Node.js 를 사용했었는데 단점이 있습니다.

  1. window api 에 대한 접근이 어려움

  2. process 를 관리하기가 힘듬

  3. 사용하는 패키지 중에 build 라도 해야 한다면 각 서버마다 build 해야함

어려운건 아니지만 컴파일러를 설치해야 합니다. 적어도 0MQ...

  4. process 를 자식으로 생성해서 관리하는데 버그가 있음 

평소에는 멀쩡하다 패킷이 몰렸더니 데드락.. detach 하고 node를 죽였더니 풀림...


구현은 쉬운데, 아쉬운점이 많아서 아래 포스팅(self-hosting)을 보고 C#으로

서론은 이정도 하고 간단하게 구현해 보겠습니다.

  

1. 프로젝트 생성시 ASP.NET 웹 응용프로그램으로 생성하고, 옵션에서 web api를 선택합니다.



2. 요청시 보여주고 싶은 데이터를 Model 폴더에 class 로 생성합니다. 

namespace 때문에 굳이 model 폴더에...


3.웹에서 접근할 API 를 만들어 줍니다. 


1. 설정하기 나름이지만, 기본적으로 api/Controller이름 을 사용합니다.


2. 컨트롤러 클래스 이름을 PlayerController 로 생성했습니다. 


express 버전에서는 이렇게 까지 안만들어 졌던거 같은데....


3. 일단 이대로 빌드하고 실행해도 결과를 확일 할 수 있습니다.


실행하면 IE로 뜨게 되는데 그냥 내비두고, 크롬에서 주소창에 IE에서 보여준 주소 뒤에 /api/Player 를 입력하면 결과를 확일 할 수 있습니다.


굳이 크롬으로 하는 이유는 IE는 JSON 파일을 다운로드 받으려고 하고, 크롬은 XML 로 바로 보여줘서 입니다.


4. 이제 GET 요청시 보내줄 데이터를 위에서 생성한 Player 클래스와 연결해 봅시다.

PlayerController 클래스를 수정합니다. 


이제 확인을...


ID 로 요청해 봅니다.


POST 와 DEL 은 확인하려면 Web 페이지도 만들어야 하니 여기까지...


이정도만 만들어두면 어느 웹 or 앱 에서 Request 만해서 똭! 해서 멋진걸 만들수 있습니다.




'In to the C#' 카테고리의 다른 글

C# 6.0 New Features  (2) 2015.01.29
[C#] Task의 작업완료  (2) 2014.01.26
[C#] Action, Func 그리고 Task  (0) 2014.01.26
[C#] Attribute : 속성  (0) 2014.01.24
Lazy Initialization  (0) 2014.01.20
In to the C# 2014. 1. 26. 22:41

[C#] Task의 작업완료

Task는 기본적으로 ThreadPool을 사용하여 비동기 작업을 쉽게 구현할 수 있도록 도와 줍니다.

작업 후 동기화는 방법도 여러가지가 있습니다. 먼저 예제가 있습니다.

 

Line 1 ~ 2까지는 Action을 정의 한 후 Task로 시작 하였습니다.

Line 4는 Task의 작업을 기다리고 있습니다. Task의 작업이 오래 걸리면 중간의 작업이 완료될 때 까지 기다릴 수 있습니다.

Line 5는 조금 색다른 기능입니다. Task의 작업이 끝나면 t1의 작업이 끝나면 파라미터로 넘긴 익명메소드가 실행이 될 수 있도록 합니다. 이런 작업은 미리 후반 작업을 설정함으로써 Task 작업이 언제 종료될지 기다리고 관리할 필요가 없어집니다.

예제에는 _t1은 t1의 작업이 끝나면 파라미터 익명 메소드에 자기 자신을 파라미터로 넘깁니다.

Line 6은 Line 5와 똑같으며, 단시 리턴값이 있는 것입니다. Line 7은 return 값을 화면에 출력하는 것입니다.

 

Line 7에서 retTask.Result를 사용했는데 Result를 호출하면 retTask의 작업이 완료되기 까지 기다립니다. 중간에 Wait 메소드를 호출할 필요가 없는 거죠. 어차피 Result를 호출한다는 것은 작업이 완료되기 까지 기다리겠다는 뜻이니까요.

 

여기까지 Task의 동기화에 대해서 알아봤습니다.

 

'In to the C#' 카테고리의 다른 글

C# 6.0 New Features  (2) 2015.01.29
[C#] REST API 만들기  (0) 2014.02.13
[C#] Action, Func 그리고 Task  (0) 2014.01.26
[C#] Attribute : 속성  (0) 2014.01.24
Lazy Initialization  (0) 2014.01.20
In to the C# 2014. 1. 26. 22:40

[C#] Action, Func 그리고 Task

C#의 대리자(delegate)와 Task에 대해서 알아보겠습니다. 대리자와 Task는 항상 따라다니는 기술이며, 수많은 오픈소스도 이 두개의 개념을 적극적으로 사용하여, 비동기 로직을 구현하고 있습니다. Action과 Func은 대리자로 구현되어져 있습니다. Action이 어떻게 구현 되었는지 보겠습니다.

 

정말 별거 없습니다.

잠시만!! Action과 Func의 차이점에 대해서 얘기 하자면, Action은 파라미터만 있는 대리자 역활을 합니다. 즉, 리턴 할 수 없는 대리자 입니다. 반면에 Func은 파라미터 및 리턴 모두 할 수 있는 대리자 입니다. 이 둘의 차이점은 이것 말고는 없습니다.

 

Action은 이런 식으로 16개의 파라미터를 갖을 수 있으며, Func은 16개의 파라미터와 1개의 리턴을 갖을 수 있습니다.

Action과 Func은 굳이 정의할 필요가 없을 듯 보이지만 많은 라이브러리에서 이런 공통적인 대리자를 사용함으로써 사용자의 입장에서 보면 어려움 없이 사용할 수 있도록 하였습니다.

 

간단히 Action 정의 및 사용법에 대해 보겠습니다.

 

Line1을 보면 파라미터 없는 Action을 사용한 것입니다. action이라는 대리자에 익명함수를 정의 한 것입니다.

Line2는 string 파라미터를 갖는 Action입니다. Line3은 string과 int형 파라미터를 갖는 Action 입니다.

Line 5 ~ 7은 함수 사용하듯이 사용합니다.

 

이번엔 Func 입니다.

 

Func은 리턴 값이 꼭 있어야 합니다. 리턴 타입은 가장 마지막에 적어주면 됩니다.

 

이렇듯이 Action과 Func은 함수를 객체처럼 사용할 수 있습니다. 지금까지 Action과 Func을 본 이유는 Task를 설명하기 위해서 입니다.

Task는 C#에서 비동기 작업을 작성하기 위한 코드를 단순화 시켜줍니다. Task는 닷넷프레임워크에서 제공하는 ThreadPool에서 작동합니다. 아쉽지만 Task를 사용할 때는 순서나 시작 시점을 사용자가 지정할 수 없습니다. 즉, Task는 어떠한 비동기 작업을 수행한다라고만 지정해 줄 뿐 수행에 대한 컨트롤을 하기 어렵습니다. 그런데 Task를 왜 쓰냐면 아래와 같습니다.

 

1. 이미 만들어진 Thread에서 작동하기 때문에 Thread를 생성할 필요가 없습니다. Thread생성 비용을 줄일 수 있습니다.

2. 프로그래밍의 복잡도가 낮아집니다. 익명함수를 만들어 Task 실행만 해주면 됩니다.

3. 프로그래밍 복잡도가 낮아지므로써 병행 작업이 가능한 코딩이 쉽습니다.

4. ThreadPool의 모든 Thread가 작업중일 때는 추가 Thread가 생성이 됩니다. 이는 언덕등반오르기 알고리즘을 사용합니다.

 

마이크로소프트에서는 병행프로그래밍을 작성할 때는 가능한 Task를 사용하길 권하고 있습니다. 빠르고 안전하기 때문입니다. 그럼 언제 Thread를 사용하느냐하면,

 

1. 단독 쓰레드에서 안정적으로 지속적인 백그라운드 작업이 필요할 경우 Thread를 생성하여 작업 합니다.

 

굳이 시작시점과 종료시점을 정해야 할 작업이 아니라면 Task를 사용하는 것들 권하는 것입니다. 편하고, 빠르니까요.

 

이 Task는 생성될 때 생성자 파라미터에 Action, Action<object>, Func<TResult>, Func<object, TResult> 형식을 넘길 수 있습니다. 아래와 같이 말이죠.

 

이렇게 Task는 대리자를 통한 익명함수를 넘겨주면서 작업을 비동기 방법으로 수행 할 수 있도록 해줍니다.

Task는 굳이 생성자로 만들고 Start를 해줄 필요는 없습니다. Task는 Factory 메소드가 있어 익명함수를 만들어 넘겨주면 바로 실행 할 수 있도록 해주는 기능도 있습니다.

 

이렇게 하면 Task 생성 및 Start 메소드 호출을 할 필요는 없습니다. 여기까지 Action과 Func 그리고 이들을 사용하는 Task와 Task의 시작에 대해서 알아봤습니다. 다음 포스트에는 Task를 사용하는 방법에 대해서 간단히 알아보겠습니다.

 

'In to the C#' 카테고리의 다른 글

[C#] REST API 만들기  (0) 2014.02.13
[C#] Task의 작업완료  (2) 2014.01.26
[C#] Attribute : 속성  (0) 2014.01.24
Lazy Initialization  (0) 2014.01.20
BookSleeve - Pipelined .NET bindings for redis  (0) 2014.01.17