Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 748. Windows + Foundry Local - 로컬에서 AI 모델 활용 [링크 복사], [링크+제목 복사],
조회: 332
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

Windows + Foundry Local - 로컬에서 AI 모델 활용

AI 모델 활용이 점점 더 쉬워지고 있군요. ^^ 물론, OpenAI와 같은 서비스는 방대한 모델 구축 및 연동 서비스를 통해 좀 더 정교한 결과를 제공하지만 때로는 비용이나 사내 서비스 등의 보안 이슈로 인해 자체 구축한 모델을 활용해야 할 때가 있습니다.

재미있게도, 이러한 흐름에 윈도우 운영체제도 발맞추고 있는데요, 이름하여 "Windows AI Foundry"라는 기능이 그것입니다.

What is Windows AI Foundry?
; https://learn.microsoft.com/en-us/windows/ai/overview

AI Foundry는 활용 환경에 따라 총 3가지 중의 하나를 선택할 수 있는데요,

  1. Windows AI APIs
  2. Foundry Local
  3. Windows ML

첫 번째는 아쉽게도 Copilot PC라고 해서 ARM CPU와 함께 NPU를 기본 장착한 PC에서만 사용할 수 있습니다. Windows 자체에 AI 관련한 모델 및 API를 통합시켰다는 것도 의미가 있지만, 최소 하드웨어 요구 사항을 지정함으로써 성능을 확실하게 보장해 준다는 장점이 있습니다.

만약 일반적인 PC라면 나머지인 Foundry Local과 Windows ML을 선택할 수 있습니다. "Foundry Local"의 경우 원래 "Azure AI Foundary"로 제공하던 기능의 로컬 버전이라고 하는데요,

Get started with Foundry Local
; https://learn.microsoft.com/en-us/windows/ai/foundry-local/get-started

[출처: https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-local/concepts/foundry-local-architecture#key-components]
foundry-local-arch.png

잘은 모르겠지만, NVidia의 Triton Inference Server 역할이 곧 "Foundry Local"이라고 봐도 좋을 듯합니다. 이걸 썼을 때의 장점이라면, 뭐랄까... 여차하면 Cloud의 연산 능력을 활용하도록 쉽게 전환할 수 있다는 점이 아닐까 싶습니다. 참고로, Azure AI Foundry Catalog에서 제공하는 모델은 다음의 링크에서 확인할 수 있습니다.

Azure AI Foundry / 모델 카탈로그
; https://ai.azure.com/explore/models

마지막으로 "Windows ML"은, 기존의 ML 라이브러리라고 봐도 좋겠습니다.

What is Windows ML
; https://learn.microsoft.com/en-us/windows/ai/new-windows-ml/overview

이것들 중에서 이번에 다룰 내용은, 두 번째에 해당하는 "Foundry Local"입니다.




아직 Prevew 단계라 나중에는 많이 바뀔 수도 있으니, 지금 자세하게 보는 것보다는 대충 아래의 내용을 읽어가면서 흐름만 이해해도 좋을 듯합니다.

우선, 설치는 winget을 이용해 다음과 같이 간단하게 할 수 있습니다.

winget install Microsoft.FoundryLocal

// 설치 시 "0x80d02002" 오류가 발생할 수 있습니다. 

설치 후 시작 메뉴를 통해 "Foundry Local" 앱을 실행하면 명령행 창이 뜨는데요,

Description:
  Foundry Local CLI: Run AI models on your device.

  🚀 Getting started:

     1. To view available models: foundry model list
     2. To run a model: foundry model run <model>

     EXAMPLES:
         foundry model run phi-3-mini-4k

Usage:
  foundry [command] [options]

Options:
  -?, -h, --help  Show help and usage information
  --version       Show version information

Commands:
  model    Discover, run and manage models
  cache    Manage the local cache
  service  Manage the local model inference service

C:\Users\testusr>

이와 함께 "Foundry Local" 서비스를 호스팅하는 "Inference.Service.agent.exe" 프로세스가 함께 실행됩니다.

// Inference.Service.agent.exe 경로: "C:\Program Files\WindowsApps\Microsoft.FoundryLocal_0.3.9267.43123_x64__8wekyb3d8bbwe"

C:\Users\testusr> foundry service status
🟢 Model management service is running on http://localhost:5273/openai/status

C:\Users\testusr> curl http://localhost:5273/openai/status
{
  "endpoints": [
    "http://localhost:5273"
  ],
  "modelDirPath": "C:\\Users\\testusr\\.foundry\\cache\\models",
  "pipeName": null
}

달리 말해 Triton Inference Server처럼 저 프로세스가 AI 모델을 호스팅하고, 클라이언트는 이 프로세스에 HTTP 요청을 보내 모델을 실행하는 구조입니다.

자, 그럼 현재 가용한 모델 목록을 볼까요?

C:\Users\testusr> foundry model list
🟢 Service is Started on http://localhost:5273, PID 42196!
Alias                          Device     Task               File Size    License      Model ID
-----------------------------------------------------------------------------------------------
phi-4                          GPU        chat-completion    8.37 GB      MIT          Phi-4-cuda-gpu
                               GPU        chat-completion    8.37 GB      MIT          Phi-4-generic-gpu
                               CPU        chat-completion    10.16 GB     MIT          Phi-4-generic-cpu
--------------------------------------------------------------------------------------------------------
phi-3-mini-128k                GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-128k-instruct-cuda-gpu
                               GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-128k-instruct-generic-gpu
                               CPU        chat-completion    2.54 GB      MIT          Phi-3-mini-128k-instruct-generic-cpu
---------------------------------------------------------------------------------------------------------------------------
phi-3-mini-4k                  GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-4k-instruct-cuda-gpu
                               GPU        chat-completion    2.13 GB      MIT          Phi-3-mini-4k-instruct-generic-gpu
                               CPU        chat-completion    2.53 GB      MIT          Phi-3-mini-4k-instruct-generic-cpu
-------------------------------------------------------------------------------------------------------------------------
mistral-7b-v0.2                GPU        chat-completion    3.98 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-cuda-gpu
                               GPU        chat-completion    4.07 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-generic-gpu
                               CPU        chat-completion    4.07 GB      apache-2.0   mistralai-Mistral-7B-Instruct-v0-2-generic-cpu
-------------------------------------------------------------------------------------------------------------------------------------
phi-3.5-mini                   GPU        chat-completion    2.13 GB      MIT          Phi-3.5-mini-instruct-cuda-gpu
                               GPU        chat-completion    2.16 GB      MIT          Phi-3.5-mini-instruct-generic-gpu
                               CPU        chat-completion    2.53 GB      MIT          Phi-3.5-mini-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
deepseek-r1-14b                GPU        chat-completion    9.83 GB      MIT          deepseek-r1-distill-qwen-14b-cuda-gpu
                               GPU        chat-completion    10.27 GB     MIT          deepseek-r1-distill-qwen-14b-generic-gpu
                               CPU        chat-completion    11.51 GB     MIT          deepseek-r1-distill-qwen-14b-generic-cpu
-------------------------------------------------------------------------------------------------------------------------------
deepseek-r1-7b                 GPU        chat-completion    5.28 GB      MIT          deepseek-r1-distill-qwen-7b-cuda-gpu
                               GPU        chat-completion    5.58 GB      MIT          deepseek-r1-distill-qwen-7b-generic-gpu
                               CPU        chat-completion    6.43 GB      MIT          deepseek-r1-distill-qwen-7b-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-0.5b                   GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-0.5b-instruct-cuda-gpu
                               GPU        chat-completion    0.68 GB      apache-2.0   qwen2.5-0.5b-instruct-generic-gpu
                               CPU        chat-completion    0.80 GB      apache-2.0   qwen2.5-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-1.5b                   GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-1.5b-instruct-cuda-gpu
                               GPU        chat-completion    1.51 GB      apache-2.0   qwen2.5-1.5b-instruct-generic-gpu
                               CPU        chat-completion    1.78 GB      apache-2.0   qwen2.5-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-7b               GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-coder-7b-instruct-cuda-gpu
                               GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-coder-7b-instruct-generic-gpu
                               CPU        chat-completion    6.16 GB      apache-2.0   qwen2.5-coder-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-0.5b             GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-cuda-gpu
                               GPU        chat-completion    0.52 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-generic-gpu
                               CPU        chat-completion    0.80 GB      apache-2.0   qwen2.5-coder-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-1.5b             GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-cuda-gpu
                               GPU        chat-completion    1.25 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-generic-gpu
                               CPU        chat-completion    1.78 GB      apache-2.0   qwen2.5-coder-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
phi-4-mini                     GPU        chat-completion    3.60 GB      MIT          Phi-4-mini-instruct-cuda-gpu
                               GPU        chat-completion    3.72 GB      MIT          Phi-4-mini-instruct-generic-gpu
                               CPU        chat-completion    4.80 GB      MIT          Phi-4-mini-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------
phi-4-mini-reasoning           GPU        chat-completion    3.15 GB      MIT          Phi-4-mini-reasoning-cuda-gpu
                               GPU        chat-completion    3.15 GB      MIT          Phi-4-mini-reasoning-generic-gpu
                               CPU        chat-completion    4.52 GB      MIT          Phi-4-mini-reasoning-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
qwen2.5-14b                    GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-14b-instruct-cuda-gpu
                               CPU        chat-completion    11.06 GB     apache-2.0   qwen2.5-14b-instruct-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
qwen2.5-7b                     GPU        chat-completion    4.73 GB      apache-2.0   qwen2.5-7b-instruct-cuda-gpu
                               GPU        chat-completion    5.20 GB      apache-2.0   qwen2.5-7b-instruct-generic-gpu
                               CPU        chat-completion    6.16 GB      apache-2.0   qwen2.5-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-14b              GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-coder-14b-instruct-cuda-gpu
                               GPU        chat-completion    8.79 GB      apache-2.0   qwen2.5-coder-14b-instruct-generic-gpu
                               CPU        chat-completion    11.06 GB     apache-2.0   qwen2.5-coder-14b-instruct-generic-cpu

대략 17개 정도의 모델이 있는데요, 로컬에 설치된 모델은 이렇게 확인할 수 있습니다.

C:\Users\testusr> foundry cache location
💾 Cache directory path: C:\Users\testusr\.foundry\cache\models

C:\Users\testusr> foundry cache list
No models cached on device

최초 실행인 경우 당연히 저렇게 비어 있을 것이고, 아무래도 모델의 용량이 크다 보니 경로를 바꾸는 것을 고려해 볼 수 있습니다.

C:\Users\testusr> foundry cache cd E:\foundry_cache
Restarting service...
🔴 Service is stopped.
🟢 Service is Started on http://localhost:5273, PID 60160!

이제 테스트를 위해 간단하게 (하지만 무려 2.1GB가 넘는) 모델을 하나 다운로드하고,

C:\Users\testusr> foundry model run phi-3-mini-4k
Downloading model...
[####################################] 100.00 % [Time remaining: about 0s]         4.1 MB/s
🕐 Loading model...
🟢 Model Phi-3-mini-4k-instruct-cuda-gpu loaded successfully

Interactive Chat. Enter /? or /help for help.

Interactive mode, please enter your prompt
>

곧바로 제공되는 interactive mode에서 모델과 chat-completion 테스트를 할 수 있습니다. 물론, OpenAI/ChatGPT에 익숙한 분들에게는 실망스럽겠지만 엄연히 저것은 하나의 LLM(Large Language Model)에 불과하므로 그 이상을 기대해서는 안 됩니다.

// "Phi-3-mini-4k" 모델 사용 예

> 한글 창제일은?
🤖 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다. 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다. 한글은 조선 세종 1세기 1494년에 창제되었으며, 이러한 창제는 한글이라는 글자 속에 있음을 의미한다.

(Note: Hangul, the Korean alphabet, was created in 1443 by King Sejong the Great and his scholars. The year 1494 mentioned in the question is incorrect. The correct year of Hangul's creation is 1443.)


즉, 실제 사용 시에는 fine-tunning을 하거나 적절하게 자신의 업무 도메인에 해당하는 정보와 연동하는 처리를 해야 합니다.

참고로, 위의 "Phi-3-mini-4k" 모델은 "mini" 버전이긴 하지만 GTX 1070 GPU에서는 답변이 한 세월이 걸렸고, 그나마 RTX 4060 Ti에서는 매끄럽게 동작했습니다. 하지만, 이 모델은 너무 경량화여서 한글 처리가 좀 미숙합니다.

// "Phi-3-mini-4k" 모델 사용 예

> 루트 5의 값은?
🤖 루트 5의 값은 8입니다.

료 5은 다음과 같은 수학 연산의 표현입니다:

루트 5 = 5^1

루트 5의 활성화 연산은 원자 수의 자기 반영을 의미합니다, 따라서 5^1은 원자 수 5를 자기 반영하여 8입니다.

Mathematics is a universal language, and the expression "5^1" represents the exponentiation operation, which means "5 raised to the power of 1". The result of 5^1 is 5, but since the question asks for "root 5", it seems there might be a misunderstanding or typo in the question. If the question intended to ask for the square root of 5, then the answer would be approximately 2.236. However, if the question indeed meant "root 5", it would be the fifth root of 5, which is approximately 1.379.

Since the question might have been intended to ask for the square root of 5, the answer provided is the square root of 5, which is approximately 2.236. However, if the question was indeed about the fifth root of 5, the answer would be approximately 1.379.


좀 그렇죠? ^^ 반면, 좀 더 나은 모델을 선택해서, 가령 (8GB에 해당하는) "Phi-4"를 사용하면 한글도 잘 처리하지만,

C:\Users\testusr> foundry model run phi-4
...[생략]...

Interactive mode, please enter your prompt
> 루트 5의 값은?
🤖 루트 5의 값은 5의 제곱근을 의미합니다. 5의 제곱근은 정확히 2.23606797749979와 같은 소수입니다. 일반적으로는 약 2.236으로 근사하여 사용합니다.


문제는, Phi-4 모델의 경우 RTX 4060 Ti에서조차도 답변 시간이 현실적으로는 사용하기 힘든 수준으로 걸렸다는 점입니다. 결국, "Foundry Local"의 문서에서 말하는 것처럼 아무리 다양한 CPU/GPU 지원을 하고 쓰기 쉽게 모델을 호스팅 해준다고는 해도, "현실적인" 것을 고려하면 "Azure AI Foundry"로 갈 수밖에 없을 듯합니다. 단지, 개발만 로컬에서 비용 없이, 보다 쉽게 할 수 있다는 정도의 의미만 있지 않을까... 라는 개인적인 생각입니다. ^^

아니면 아예 "Copilot PC" 정도는 되어야 현실성이 있을 것 같습니다.




당연히, CLI가 아닌 코드를 통해서도 Foundry Local 서버와 연동할 수 있습니다. 아쉽게도 C# 라이브러리가 아직 없는데요,

Integrate inferencing SDKs with Foundry Local
; https://learn.microsoft.com/en-us/azure/ai-foundry/foundry-local/how-to/how-to-integrate-with-inference-sdks?pivots=programming-language-python

따라서 Python을 이용해 다음과 같이 연동할 수 있습니다.

// 파이썬 3.9 이상, foundry-local-sdk 패키지와 openai 패키지 설치
// 
// conda create --name py311build python=3.11 -y
// conda activate py311build
// python -m pip install foundry-local-sdk
// python -m pip install openai

c:\temp> type test.py
import openai
from foundry_local import FoundryLocalManager

# By using an alias, the most suitable model will be downloaded 
# to your end-user's device.
alias = "phi-3.5-mini"

# Create a FoundryLocalManager instance. This will start the Foundry 
# Local service if it is not already running and load the specified model.
manager = FoundryLocalManager(alias)

# Configure the client to use the local Foundry service
client = openai.OpenAI(
    base_url=manager.endpoint,
    api_key=manager.api_key  # API key is not required for local usage
)

stream = client.chat.completions.create(
    model=manager.get_model_info(alias).id,
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
    stream=True
)

# Print the streaming response
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)

그런데 가만 보면, "foundry-local-sdk" 패키지가 제공하는 것은 로컬에 실행 중인 "Foundry Local" 서비스에 대한 정보를 제공하는 것밖에 없습니다. (아마도 "\Device\NamedPipe\inference_agent" 이름의 named pipe로 통신해 매번 바뀌는 포트 번호를 포함한 Endpoint 정보 등을 조회할 것입니다.)

이후의 코드는 단순히 OpenAI 패키지에서 제공하는 기능을 그대로 사용하는 건데요, 그렇다면 C#의 OpenAI 패키지로도 연동할 수 있지 않을까요?

OpenAI 
; https://www.nuget.org/packages/OpenAI/

아쉽게도, (제가 방법을 모르는 걸 수도 있는데) C# 버전의 OpenAI 패키지에서는 저렇게 사용해도 오류가 발생합니다. 가령, OpenAI 측으로 위와 같은 요청을 보내는 소스 코드를 다음과 같이 만들 수 있는데,

using OpenAI;
using OpenAI.Chat;
using System.ClientModel;

namespace ConsoleApp1;

internal class Program
{
    // Install-Package OpenAI 
    static async Task Main(string[] args)
    {
        string ep = "https://api.openai.com/v1";
        string key = "sk-proj-[...생략]...";
        string alias = "gpt-3.5-turbo";

        OpenAIClientOptions options = new OpenAIClientOptions();
        options.Endpoint = new Uri(ep);

        ApiKeyCredential akc = new ApiKeyCredential(key);
        ChatClient client = new(alias, akc, options);

        ChatCompletion completion = client.CompleteChat("Why is the sky blue?'");

        foreach (var message in completion.Content)
        {
            Console.WriteLine($"[{message.Kind}]: {message.Text}");
        }
    }
}

/* 실행 결과:
[Text]: The sky appears blue because of the way the Earth's atmosphere scatters sunlight. Sunlight is composed of all the colors of the rainbow, but when it passes through the Earth's atmosphere, the shorter blue wavelengths of light are scattered in all directions by the gases and particles in the air. This causes the blue light to dominate our view of the sky, giving it its blue appearance.
*/

파이썬의 FoundryLocalManager로 알아낸 EndPoint와 Key를,

import openai
from foundry_local import FoundryLocalManager

# By using an alias, the most suitable model will be downloaded 
# to your end-user's device.
alias = "phi-3.5-mini"

# Create a FoundryLocalManager instance. This will start the Foundry 
# Local service if it is not already running and load the specified model.
manager = FoundryLocalManager(alias)

print(manager.endpoint) // http://localhost:5273/v1
print(manager.api_key) // OPENAI_API_KEY

Foundry Local의 모델에 대한 Alias를 곁들여,

C:\Users\testusr> foundry cache list
Models cached on device:
   Alias                         Model ID
💾 phi-3-mini-4k                 Phi-3-mini-4k-instruct-cuda-gpu
💾 phi-3.5-mini                  Phi-3.5-mini-instruct-cuda-gpu
💾 phi-4                         Phi-4-cuda-gpu

C# OpenAI 라이브러리에 설정해도,

string ep = "http://localhost:5273/v1";
string key = "OPENAI_API_KEY";  // Foundry Local에는 API Key가 필요 없다고 하는데, 빈 문자열로 넘기면 예외 발생
string alias = "phi-3.5-mini";

// ...[생략]...

실행 시 이런 오류가 발생합니다.

Unhandled exception. System.ClientModel.ClientResultException: Service request failed.
Status: 400 (Bad Request)

   at OpenAI.ClientPipelineExtensions.ProcessMessage(ClientPipeline pipeline, PipelineMessage message, RequestOptions options)
   at OpenAI.Chat.ChatClient.CompleteChat(BinaryContent content, RequestOptions options)
   at OpenAI.Chat.ChatClient.CompleteChat(IEnumerable`1 messages, ChatCompletionOptions options, CancellationToken cancellationToken)
   at OpenAI.Chat.ChatClient.CompleteChat(ChatMessage[] messages)
   at ConsoleApp1.Program.Main(String[] args) in C:\temp\ConsoleApp1\ConsoleApp1\Program.cs:line 30
   at ConsoleApp1.Program.<Main>(String[] args)

음... 디버깅하기 귀찮군요. ^^ 일단은 그냥 아직 Preview 버전이니 정식 버전이 나올 때까지 여유롭게 기다리면 C# Foundry Client 라이브러리가 나올지도 모르니 여기까지만 하겠습니다. ^^

검색해 보니까 Azure AI Foundry를 대상으로 한 라이브러리가 있는 것 같은데,

Azure Inference client library for .NET
; https://github.com/Azure/azure-sdk-for-net/blob/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/README.md

아마 저기에 Foundry Local에 대한 통합도 해주지 않을까... 라는 기대를 해봅니다. ^^;




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/6/2025]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
13064정성태5/18/202216462.NET Framework: 2016. C# - JIT 컴파일러의 인라인 메서드 처리 유무
13063정성태5/18/202216841.NET Framework: 2015. C# - 인라인 메서드(inline methods)
13062정성태5/17/202217493.NET Framework: 2014. C# - async/await 그리고 스레드 (4) 비동기 I/O 재현 [1]파일 다운로드1
13061정성태5/16/202216616.NET Framework: 2013. C# - FILE_FLAG_OVERLAPPED가 적용된 파일의 읽기/쓰기 시 Position 관리파일 다운로드1
13060정성태5/15/202220167.NET Framework: 2012. C# - async/await 그리고 스레드 (3) Task.Delay 재현파일 다운로드1
13059정성태5/14/202218044.NET Framework: 2011. C# - CLR ThreadPool의 I/O 스레드에 작업을 맡기는 방법 [1]파일 다운로드1
13058정성태5/13/202218079.NET Framework: 2010. C# - ThreadPool.SetMaxThreads 사용법 [1]
13057정성태5/12/202219579오류 유형: 812. 파이썬 - ImportError: cannot import name ...
13056정성태5/12/202215453.NET Framework: 2009. C# - async/await 그리고 스레드 (2) MyTask의 호출 흐름 [2]파일 다운로드1
13055정성태5/11/202220163.NET Framework: 2008. C# - async/await 그리고 스레드 (1) MyTask로 재현 [11]파일 다운로드1
13054정성태5/11/202216863.NET Framework: 2007. C# - 10진수 숫자를 담은 문자열을 숫자로 변환하는 방법 [11]파일 다운로드1
13053정성태5/10/202216187.NET Framework: 2006. C# - GC.KeepAlive 메서드의 역할
13052정성태5/9/202216662.NET Framework: 2005. C# - 생성한 참조 개체가 언제 GC의 정리 대상이 될까요?
13051정성태5/8/202216000.NET Framework: 2004. C# XingAPI - ACF 검색 결과로 구한 CSV 파일을 통해 퀀트 종목 찾기파일 다운로드1
13050정성태5/6/202216069.NET Framework: 2003. C# - COM 개체의 이벤트 핸들러에서 발생하는 예외에 대한 CLR의 특별 대우파일 다운로드1
13049정성태5/6/202213358오류 유형: 811. GoLand - Error: Cannot find package
13048정성태5/6/202215848오류 유형: 810. "ASUS TUF GAMING B550M-PLUS (WI-FI)" 모델에서 블루투스 장치가 인식이 안 되는 문제
13047정성태5/6/202215343오류 유형: 809. Speech Recognition could not start
13046정성태5/5/202215946.NET Framework: 2002. C# XingAPI - ACF 파일을 이용한 퀀트 종목 찾기(t1857)
13045정성태5/5/202216659.NET Framework: 2001. C# XingAPI - 주식 종목에 따른 PBR, PER, ROE 구하는 방법(t3341 예제)
13044정성태5/4/202215330오류 유형: 808. error : clang++ exited with code 127
13043정성태5/3/202214017오류 유형: 807. C# - 닷넷 응용 프로그램에서 Informix DB 사용 시 오류 메시지 정리
13042정성태5/3/202215810.NET Framework: 2000. C# - 닷넷 응용 프로그램에서 Informix DB 사용 방법파일 다운로드1
13041정성태4/28/202215474개발 환경 구성: 642. Informix 데이터베이스 docker 환경 구성
13040정성태4/27/202214752VC++: 156. 비주얼 스튜디오 - Linux C/C++ 프로젝트에서 openssl 링크하는 방법
13039정성태4/27/202218682.NET Framework: 1999. C# - Playwright를 이용한 간단한 브라우저 제어 실습
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...