입력된 URL을 얼마만에 받을 수 있는지 확인하는 예제 입니다.

 

한 버튼은 동기 방식으로 동작을 하고

 

다른 한 버튼은 비동기 방식 및 병렬 처리를 하여 동작을 합니다.

 

동기 방식일 경우에는 시간도 오래 걸리고 버튼 클릭 시 다른 UI들이 반응을 하지 않지만

 

비동기 방식일 경우에는 시간도 단축되며 버튼 클릭 하여도 다른 UI들의 동작도 가능합니다.

 

실행 예제 입니다.

 

네이버 Open API 이용하여 로그인 및 접근 토큰 / 인증코드 / 상태 코드 구하기 입니다.

 

 

using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Web;
using System.Windows.Forms;

namespace NaverLogin
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            #region 이벤트를 설정합니다.

            this.naverLoginButton.Click         += naverLoginButton_Click;
            this.callBackButton.Click           += callBackButton_Click;
            this.accessTokenRequestButton.Click += accessTokenRequestButton_Click;
            this.accessTokenDeleteButton.Click  += accessTokenDeleteButton_Click;

            #endregion
        }

        #endregion

        // Event Method (Private)

        #region naverLoginButton_Click() - 버튼 클릭시 동작합니다.

        /// <summary>
        /// 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void naverLoginButton_Click(object sender, EventArgs e)
        {
            string clientID    = "클라이언트 아이디";
            string redirectURL = "등록한 리다이렉트 주소";

            string state       = (new Random()).Next().ToString();

            NameValueCollection listAuthURL_QueryString = HttpUtility.ParseQueryString(string.Empty);

            listAuthURL_QueryString["response_type"] = "code";
            listAuthURL_QueryString["client_id"    ] = clientID;
            listAuthURL_QueryString["redirect_uri" ] = redirectURL;
            listAuthURL_QueryString["state"        ] = state;

            string autoURL = "https://nid.naver.com/oauth2.0/authorize?" + listAuthURL_QueryString.ToString();

            this.naverLoginWebBrowser.Navigate(new Uri(autoURL));
        }

        #endregion
        #region callBackButton_Click() - 버튼 클릭시 동작합니다.

        /// <summary>
        /// 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void callBackButton_Click(object sender, EventArgs e)
        {
            NameValueCollection query = HttpUtility.ParseQueryString(this.naverLoginWebBrowser.Url.Query);

            this.resultRichTextBox.Text += "콜백 URL 인증 정보 : " + query.ToString() + Environment.NewLine;
        }

        #endregion
        #region accessTokenRequestButton_Click() - 버튼 클릭시 동작합니다.

        /// <summary>
        /// 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void accessTokenRequestButton_Click(object sender, EventArgs e)
        {
            string clientID     = "클라이언트 아이디";
            string clientSecret = "Client Secret 입니다.";
            string authCode     = this.authCodeTextBox.Text;
            string authState    = this.authStateCodeTextBox.Text;

            WebClient webClient;

            string accessToken_URL = "https://nid.naver.com/oauth2.0/token";

            webClient = new WebClient();

            webClient.QueryString.Add("grant_type"   , "authorization_code");
            webClient.QueryString.Add("client_id"    , clientID            );
            webClient.QueryString.Add("client_secret", clientSecret        );
            webClient.QueryString.Add("code"         , authCode            );
            webClient.QueryString.Add("state"        , authState           );

            Stream stream = webClient.OpenRead(accessToken_URL);

            string resultJson = new StreamReader(stream).ReadToEnd();

            this.resultRichTextBox.Text += "접속 토큰 요청 결과 : " + Environment.NewLine;
            this.resultRichTextBox.Text += resultJson + Environment.NewLine;

        }

        #endregion

        #region accessTokenDeleteButton_Click() - 버튼 클릭시 동작합니다.

        /// <summary>
        /// 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void accessTokenDeleteButton_Click(object sender, EventArgs e)
        {
            string clientID        = "클라이언트 아이디";
            string clientSecret    = "Client Secret 입니다.";
            string accessToken     = this.accessCodeTextBox.Text;
            string serviceProvider = "NAVER";

            WebClient webClient;

            string accessToken_URL = "https://nid.naver.com/oauth2.0/token";

            webClient = new WebClient();

            webClient.QueryString.Add("grant_type"      , "delete"       );
            webClient.QueryString.Add("client_id"       , clientID       );
            webClient.QueryString.Add("client_secret"   , clientSecret   );
            webClient.QueryString.Add("access_token"    , accessToken    );
            webClient.QueryString.Add("service_provider", serviceProvider);

            Stream stream = webClient.OpenRead(accessToken_URL);

            string resultJson = new StreamReader(stream).ReadToEnd();

            this.resultRichTextBox.Text += "접속 토큰 삭제 결과 : " + resultJson + Environment.NewLine;
        }

        #endregion

    }
}

C# 큐브 타이머 입니다.

 

큐브 로직에 관련된 내용은 빠진 그냥 간단한 스톱워치라 보면 됩니다.

 

리스트 박스에 저장되는데 저장된 값은 내장된 SQLite의 DB에 저장이 됩니다.

 

스페이스 키로 동작됩니다. 

 

스페이스 누르면 시작하고 그 다음에 정지되면서 저장하고 

 

한번더 누르면 초기 상태로 돌아갑니다.

 

CubeTimer

소스는 아래의 Github 주소에 있습니다.

 

https://github.com/surisuri9632/CubeTimer

+ Recent posts