Program Language
-
[C#] HttpWebRequest 사용시 2개의 연결 수정2022.03.22
-
[.NET] .NET Framework 다운로드 링크2021.06.01
-
[C#] Winform에서 Invoke 메서드 사용2021.04.19
-
[C#]비동기 호출 시 Task.Run() 사용하기2021.03.16
-
[C#] MessagePack 사용 방법2020.07.13
-
[C#] Zeroformatter 사용 방법2020.07.08
[C#] HttpWebRequest 사용시 2개의 연결 수정
HttpWebRequest 객체의 BeginGetResponse 메소드를 이용해서 비동기 프로세스를 구축 할 수 있습니다.
하지만 이와 같은 시스템 구축시, 서버당 2개의 TCP 연결 제한이 걸리게 되는 현상이 발생합니다.
사내에서 부하테스를 하는 과정에서 해당 구문을 사용했을 때, 2개의 커넥션만 발생하는 문제가 발생되어
이를 해결하기 위한 방법을 정리하였습니다.
app.config 설정 추가
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
connectionManagement의 maxconnection 값의 수치를 변경합니다.
DefaultConnectionLimit 의 기본값은 2로 설정이 되어 있으며, 위 처럼 app.config에 설정을 추가함으로서 커넥션의 수치를 변경할 수 있습니다.
하지만, DefaultConnectionLimit 등록 정보를 변경해도 기존 ServicePoint 객체에는 영향을주지 않습니다.
ServicePoint 값 변경
request.ServicePoint.ConnectionLimit = 1000;
request.BeginGetResponse(
GetResponseCallback,
new RequestState
{
Request = request,
PostData = new byte[] { },
Response = signal
});
아쉽게도 설정파일로 설정이 적용되지 않는 경우 기본값은 DefaultPersistentConnectionLimit 상수로 설정됩니다.
이럴경우에는 직접 ServicePoint의 ConnectionLimit 값을 변경해서 사용해줘야 합니다.
위 처럼
request.ServicePoint.ConnectionLimit = 1000;
ServicePoint 의 ConnectionLimit 값을 변경해주면, 2개 이상의 TCP 커넥션을 사용 하 실 수 있습니다.
[출처]
http://daplus.net/net-webclient%EC%97%90%EC%84%9C-2-%EA%B0%9C%EC%9D%98-%EC%97%B0%EA%B2%B0-%EC%A0%9C%ED%95%9C%EC%9D%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%9C/
https://social.msdn.microsoft.com/Forums/en-US/1f863f20-09f9-49a5-8eee-17a89b591007/asynchronous-httpwebrequest-maximum-connections-best-approach-threads-or-delegates?forum=netfxnetcom
'Program Language > C#' 카테고리의 다른 글
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
---|---|
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[.NET] .NET Framework 다운로드 링크 (0) | 2021.06.01 |
[C#] Winform에서 Invoke 메서드 사용 (0) | 2021.04.19 |
[C#]비동기 호출 시 Task.Run() 사용하기 (0) | 2021.03.16 |
[.NET] .NET Framework 다운로드 링크
필요한 시점에 항상 찾게되는 .NET Framework 다운로드 링크!! 간혹 서버 셋팅시에 닷넷 프레임워크를 수동으로 다운 받아야 하는 경우가 있는데요.
그때! 빠르게나마 찾기 위해서 다운로드 링크를 필요에 의해서 글을 남겨놉니다.
https://dotnet.microsoft.com/download/dotnet-framework
지원하는 버전과, 그 외 버전이 잘 구분되어 있어서 편하게 다운 받을 수 있습니다.
'Program Language > C#' 카테고리의 다른 글
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
---|---|
[C#] HttpWebRequest 사용시 2개의 연결 수정 (0) | 2022.03.22 |
[C#] Winform에서 Invoke 메서드 사용 (0) | 2021.04.19 |
[C#]비동기 호출 시 Task.Run() 사용하기 (0) | 2021.03.16 |
[C#] MessagePack 사용 방법 (0) | 2020.07.13 |
[C#] Winform에서 Invoke 메서드 사용
Winform을 이용해서 프로젝트를 많이 수행하는 편은 아니다보니, 그때 그때 필요한 사항을 찾아서 개발하곤 합니다.
가급적 테스트 툴을 개발하는 목적으로 많이 사용하다보니, 사용성은 적은데요.
그러다 보면, 가끔 List View를 이용해서 Log 를 보여줄때 thread 에 영향을 받게 되는 경우가 발생합니다.
msdn 에 검색해 보니, 아래 링크 검색이 되서 공유합니다.
사용방법
저는 주로 delegate를 이용해서 Log를 찍는 방법을 선호합니다.
public partial class MainForm : Form
{
private delegate void SafeUpdateText(string text);
public MainForm()
{
InitializeComponent();
}
}
MainForm Class 에 SafeUpdateText delegate 선언해 줍니다.
public void UpdateMessage(string msg)
{
if (RichTxt_ReceiveMsg.InvokeRequired)
{
var d = new SafeUpdateText(UpdateMessage);
RichTxt_ReceiveMsg.Invoke(d, new object[] { msg });
}
else
{
RichTxt_ReceiveMsg.AppendText(msg + "\r\n");
}
}
실질적으로 작업을 수행하는 UpdateMessage 메소드에서,
InvokeRequired 메소드는, 컨트롤의 스레드 ID와 호출하는 스레드 ID를 비교하는 속성을 쿼리하는 메소입니다.
이를 이용해서 ID가 다를 경우, 기본스레드에서 대리자를 사용해 메서드를 호출하는 방식입니다.
WinForm 의 경우 UI thread를 사용하고 있으니,
위 방법을 이용하면 좋을 듯 합니다.
'Program Language > C#' 카테고리의 다른 글
[C#] HttpWebRequest 사용시 2개의 연결 수정 (0) | 2022.03.22 |
---|---|
[.NET] .NET Framework 다운로드 링크 (0) | 2021.06.01 |
[C#]비동기 호출 시 Task.Run() 사용하기 (0) | 2021.03.16 |
[C#] MessagePack 사용 방법 (0) | 2020.07.13 |
[C#] Zeroformatter 사용 방법 (0) | 2020.07.08 |
[C#]비동기 호출 시 Task.Run() 사용하기
요즘 동기와 비동기가 혼재되어 사용중인 프로젝트를 진행하고 있습니다.
최초 설계시부터 작업방식을 정해놓고 진행해야 하는데, 이 프로젝트는 그러지 못했나 봅니다.
설계과정에서부터 비동기 async / await 모델로 설계된 프로젝트가 아니라면,
중간에 적용하기에 애매한 상황이 발생합니다.
프로젝트를 다시 설계할 수 있는 상황이 아니라면, Task.Run() 메소드를 이용해서 비동기 호출을 이용 할 수 있습니다.
호출 방법
public bool Test()
{
var result = Task.Run(async () => await Update()).Result;
return result;
}
public async Task<bool> Update()
{
...
}
위와 같이 람다식을 이용해서, 비동기로 짜여진 Update() 메소드를 호출 할 수 있습니다.
'Program Language > C#' 카테고리의 다른 글
[.NET] .NET Framework 다운로드 링크 (0) | 2021.06.01 |
---|---|
[C#] Winform에서 Invoke 메서드 사용 (0) | 2021.04.19 |
[C#] MessagePack 사용 방법 (0) | 2020.07.13 |
[C#] Zeroformatter 사용 방법 (0) | 2020.07.08 |
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
[C#] MessagePack 사용 방법
MessagePack 이란?
MessagePack은 C#용 시리얼 라이저의 일종입니다. MsgPack-Cli 보다 10배 빠르다고 공식 GitHub에 명시되어 있으며, 다른 C# 직렬 변환기보다 성능이 뛰어납니다.
MessagePack for C#은 또한 매우 빠른 압축 알고리즘 인 LZ4 압축을 기본적으로 지원합니다.
특히 게임, 분산 컴퓨팅, 마이크로 서비스 또는 데이터 캐시와 같은 응용 프로그램에서 성능이 중요합니다.
공식 GitHub
https://github.com/neuecc/MessagePack-CSharp
Nuget Package를 이용한 MessagePack 설치
Nuget 패키지를 이용해서 설치를 합니다. MessagePack을 검색하여 나오는 상단의 패키지를 설치 합니다.
해당 패키지의 경우 ZeroFormatter에 비해 많은 종속성이 걸려 있습니다.
MessagePack 하나만 설치 했는데도, 아래와 같이 다양한 종속성을 가지고 있네요.
만약, 다른 패키지와 혼용해서 사용하신다면, 아래의 종속성 때문에 오류를 발생하는 경우도 한번 겪었습니다.
Sample
전반적으로 ZeroFormatter 와 사용방법에는 큰 차이가 없습니다만,
ZeroFormatter의 경우 Index Attribute를 이용했지만, MessagePack의 경우는 Key Attribute를 이용하는 차이가 있습니다.
using MessagePack;
namespace MPackTest.Models
{
[MessagePackObject]
public class GameEvent
{
[Key(0)]
public virtual int Index { get; set; }
[Key(1)]
public virtual int Season { get; set; }
[Key(2)]
public virtual int Score { get; set; }
}
}
using MessagePack;
using System;
using System.Collections.Generic;
namespace MPackTest
{
class Program
{
static void Main(string[] args)
{
var gameEvent = new List<Models.GameEvent>();
for (int i = 0; i < 1000; i++)
{
gameEvent.Add(new Models.GameEvent { Index = i, Score = i, Season = i });
}
var serialize = MessagePackSerializer.Serialize<List<Models.GameEvent>>(gameEvent);
Console.WriteLine($"Serialize 크기 : {serialize.Length}");
var deserialize = MessagePackSerializer.Deserialize<List<Models.GameEvent>>(serialize);
Console.WriteLine($"DeSerialize 50번 인덱스 : {deserialize[50].Index}");
Console.ReadLine();
}
}
}
'Program Language > C#' 카테고리의 다른 글
[C#] Winform에서 Invoke 메서드 사용 (0) | 2021.04.19 |
---|---|
[C#]비동기 호출 시 Task.Run() 사용하기 (0) | 2021.03.16 |
[C#] Zeroformatter 사용 방법 (0) | 2020.07.08 |
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
[C#] Zeroformatter 사용 방법
기존에 진행하던 프로젝트에서는 Newtonsoft Json을 이용해서 시리얼라이즈 해서 사용하였습니다.
하지만 새로 진행하는 프로젝트에서 시리얼라이즈 하는 데이터량이 상당이 많아지는 이슈가 발생하였습니다.
속도를 개선할 이슈가 발생해서, 기존에 다른 프로젝트에서 사용하였던 Zeroformatter를 다시 도입하였는데요.
이번기회에 다시 한번 정리해보려고 합니다.
Zeroformatter 란?
Zeroformatter는 C# 프로젝트에서 사용할 수 있는 직렬화 오픈소스 입니다.
다양한 시리얼라이저의 사용법을 정리할 생각이지만,
여러 시리얼라이저의 속도를 직접 비교해 보았을때, 가장 빠른 속도를 보여줬습니다.
아래의 링크를 통해서 더 자세한 정보를 확인 하실 수 있습니다.
https://github.com/neuecc/ZeroFormatter
Nuget Package를 이용한 설치
Nuget Package 관리자를 이용해서 Zeroformatter를 검색합니다.
가장 상단에 있는 ZeroFormatter를 설치합니다.
Sample
먼저 시리얼라이즈 할 객체에 추가 작업을 진행해야 합니다.
아래의 기존 Class에 Zeroformatter를 사용하기 위해서는 virtual 키워드와 index 작업을 진행해줘야 합니다.
그리고 Zeroformatter의 사용을 위한 추가 attribute 도 기입해줘야 합니다.
index작업은 진행하지 않아도 되지만, 기입하는 것이 좀 더 속도가 나온다고 합니다.
using System;
namespace ZeroTest.Models
{
public class GameEvent
{
public int Index { get; set; }
public int Season { get; set; }
public int Score { get; set; }
}
}
using System;
using ZeroFormatter;
namespace ZeroTest.Models
{
[ZeroFormattable]
[Serializable]
public class GameEvent
{
[Index(0)]
public virtual int Index { get; set; }
[Index(1)]
public virtual int Season { get; set; }
[Index(2)]
public virtual int Score { get; set; }
}
}
아래와 같이 Serialize 구문을 이용하면 됩니다.
대략 사이즈와 DeSerialize 했을때 50번째 있는 Index 값을 찍어보았습니다.
namespace ZeroTest
{
class Program
{
static void Main(string[] args)
{
var gameEvent = new List<Models.GameEvent>();
for (int i = 0; i < 1000; i++)
{
gameEvent.Add(new Models.GameEvent { Index = i, Score = i, Season = i });
}
var serialize = ZeroFormatterSerializer.Serialize<List<Models.GameEvent>>(gameEvent);
Console.WriteLine($"Serialize 크기 : {serialize.Length}");
var deserialize = ZeroFormatterSerializer.Deserialize<List<Models.GameEvent>>(serialize);
Console.WriteLine($"DeSerialize 50번 인덱스 : {deserialize[50].Index}");
Console.ReadLine();
}
}
}
참고
퍼포먼스만 보더라도 ZeroFormatter 가 Serialize 부분에서는 가장 빠르다고 나오네요.
실제 제가 테스트 해보았을 때 도 가장 빨랐던 기억이 있습니다.
다만, 단점 이라면, Index 와 virtual 키워드를 항상 달고 살아야 합니다. ^^
'Program Language > C#' 카테고리의 다른 글
[C#]비동기 호출 시 Task.Run() 사용하기 (0) | 2021.03.16 |
---|---|
[C#] MessagePack 사용 방법 (0) | 2020.07.13 |
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
[C#] ICloneable 인터페이스를 이용한 객체 복사 (1) | 2020.05.19 |