본문 바로가기
CODING/C#

C# 동시성(async)

by marketingsj 2022. 9. 9.

1.

 비동기적으로 진행되는 프로세서 처리 방식에서 빠른 작업전환으로 사용자단에서 비동기방식(병렬적인 처리방식)으로 구현할 수 있습니다.

 

2.

 C#에서 제공하는 비동기는 기본적으로 System.Threading의 Thread 클래스와 Task 클래스를 주로 사용합니다.

Task는 내부적으로 Thread 클래스로 구현되며, 다음과 같이 비동기 코드를 작성할 수 있습니다.

#define Args
using System.Threading;
using System.Threading.Tasks;

namespace REVIEW_CSHARP_BASIC
{
    public partial class AsyncExample : Form
    {
        public AsyncExample()
        {
            InitializeComponent();
            string str = "hello, world!";
            Console.WriteLine(str.Substring(7));
            Console.WriteLine(str.Substring(7, 6));
#if Async
            StartWriteLineAsync();
#endif
#if Ordinary
            StartWriteLineOrdinaryTask();
#endif
#if Args
            StartWriteLineWitheArgs();
#endif
            Console.WriteLine("[Log] Done to AsyncTask");
        }
        private async void StartWriteLineAsync()
        {
            for (int idx = 0; idx < 10; idx++)
            {
                Console.WriteLine("Hello, World!");
                await Task.Delay(100);
            }
        }
        private void StartWriteLineOrdinaryTask()
        {
            int[] retArr = new int[10];
            Action action = () =>
            {
                foreach (int i in retArr)
                {
                    Console.WriteLine("Ordinary Task!");
                    Thread.Sleep(100);
                }
            };
            Task task = new Task(action);
            task.Start();
            task.Wait();
        }
        private void StartWriteLineWitheArgs()
        {
            Action action = () =>
            {
                for (int idx = 0; idx < 10; idx++)
                {
                    WriteLineWithArgs("New Message");
                    Thread.Sleep(100);
                }
            };
            Task task = new Task(action);
            task.Start();
            task.Wait();

            void WriteLineWithArgs(string msg)
            {
                Console.WriteLine(msg);
            }

            // Another way
            Task.Run(() =>
            {
                for (int idx = 0; idx < 10; idx++)
                {
                    WriteLineWithArgs("Direct Input args");
                    Thread.Sleep(100);
                }
            });
        }
    }
}

Task 클래스에서 제공하는 .Run(Action) 메서드를 이용하여 손쉽게 비동기를 만듦과 동시에 시작 할 수 있다.

Action 인스턴스는 다음과 같이 람다형식으로 작성 가능하며, 람다 자체를 Run(() => Do())로 넣을 수 있다.

Action action = () =>
{
    for (int idx = 0; idx < 10; idx++)
    {
        WriteLineWithArgs("New Message");
        Thread.Sleep(100);
    }
};

 

댓글